ELK-報表平臺

1、目標需求

  • 實現一個報表展現
  • 簡單的報表操做,豐富的樣式展現
  • 存儲大數據量
  • 大數量狀況下的秒級查詢速度
  • 多數據來源抓取

2、實現方案

  • logstash抓取數據庫數據
  • ES作大數據量存儲
  • kibana作簡單的大屏展現
  • 還須要其餘的工做:ES數據更新,處理ES數據提供複雜聚合數據

3、Elasticsearch-7.X

一、特色和優點

  • 分佈式的文檔存儲引擎
  • 分佈式的搜索引擎和分析引擎
  • 分佈式,支持PB級數據

二、如何作到全文檢索

試想一下。若是咱們想找一下含有「月」的古詩,咱們會先去想哪些詩句包含月,例如「牀前明月光」,包含月。這麼在咱們腦海裏就有「牀前明月光」爲KEY,「月」爲Value的索引。html

什麼是倒索引。若是咱們事先在腦海裏創建了,「月」爲KEY,「靜夜思」爲Value的索引,這個問題也就不假思索的回答。這就是倒索引。java

Lucene是如何作到的。創建索引分爲一下幾步:mysql

  • 一、取出關鍵詞。步驟包含分詞,詞形還原,去除停頓詞,同一小寫等。
  • 二、創建倒排索引。由關鍵詞對應文章號(並不是文章內容)、字符位置、關鍵詞位置、出現頻率、出現位置。分爲詞典文件、頻率文件、位置文件。搜索索引時,關鍵字以字符順序排序,查詢時採用二分法查找,關係型數據庫以B+樹創建索引,所以搜索關鍵詞上快不少。
  • 三、壓縮索引。關鍵詞壓縮爲<前綴長度,後綴>。數字壓縮爲與上一值的差值。

三、名詞

Near Realtime(NRT)git

近實時,es從數據寫入到數據被搜索到有一個延時(大概1秒),基於es執行的搜索和分析能夠達到妙級github

Clustersql

集羣,包含多個節點,每一個節點屬於哪一個集羣是經過一個配置(集羣名稱)來決定,節點能夠分散到各個機器上。chrome

Node數據庫

節點,集羣中的一個節點,若是默認啓動1個或者多個節點,那麼他們自動組成一個集羣。一個elasticsearch實例即就是一個節點。每一個節點能夠有多個shard,可是primary shard和對應replica shard 不能在同一個節點上。json

indexbash

索引,包含一堆具備類似結構的文檔數據

type

類型,type是index中的一個邏輯數據分類,7.X版本只有一個

document

文檔,es中最小的數據單元,有json串組成,裏面包含多個field,每一個field便是一個數據字段。

mapping

映射,一旦創建,沒法修改,只能刪除索引,從新創建,或者冗餘數據。text:當一個字段是要被全文搜索的。keyword:類型適用於索引結構化的字段。字段只能經過精確值搜索到。

聚合-桶 聚合-指標

分類成爲桶,統計成爲指標

四、配置

ES的安裝簡單,chrome插件elasticsearch-head從git上找https://github.com/mobz/elasticsearch-head/tree/master/crx。crx文件,解壓成文件夾,導入插件。

五、查詢

版本變更很大,全部的API查官網的一手資料纔是最準確的, 官方Search APIs:www.elastic.co/guide/en/el…

建立索引
/test

{
    "settings": {
        "number_of_shards": 3,
        "number_of_replicas": 2
    },
    "mappings": {
            "properties": {
                "field1": {
                    "type": "text"
                }
            }
    }
}
複製代碼
簡單查詢
分頁
:9200/movie/adventure/_search?from=1&size=5
查詢某列
:9200/movie/adventure/1?_source=name
字符串查詢
:9200/movie/adventure/_search?q=name:life
DSL搜索
{
  "query": {
    "match": {
      "tag": "中國"
    }
  }
}

複製代碼
DSL查詢
  • _score 相關性得分

正浮點型,分數越高,文檔越相關

  • term 徹底匹配,須要映射字段不分詞
  • match 分詞匹配
  • match子句查詢相關內容
  • filter參數指示過濾器上下文
GET /_search
{
  "query": { 
    "bool": { 
      "must": [
        { "match": { "title":   "Search"        }},
        { "match": { "content": "Elasticsearch" }}
      ],
      "filter": [ 
        { "term":  { "status": "published" }},
        { "range": { "publish_date": { "gte": "2015-01-01" }}}
      ]
    }
  }
}
複製代碼
組合查詢
##### 實現如下sql
SELECT product
FROM   products
WHERE  (price = 20 OR productID = "XHDK-A-1293-#fJ3")
  AND  (price != 30)

##### 布爾過濾器, 過濾查詢已被棄用,並在ES 5.0中刪除。 
必須(must) 匹配
不能(must not) 匹配
至少有一個語句要匹配
{
   "bool" : {
      "must" :     [],
      "should" :   [],
      "must_not" : [],
   }
}  

##### 查詢
GET /my_store/products/_search
{
   "query" : {
       "bool" : {
              "should" : [
                 { "term" : {"price" : 20}}, 
                 { "term" : {"productID" : "XHDK-A-1293-#fJ3"}} 
              ],
              "must_not" : {
                 "term" : {"price" : 30} 
              }
           }
   }
}
  
複製代碼

六、版本問題

  • 有問題仍是去ES官網社區查找
  • ElasticSearch 7.x 默認不在支持指定索引類型
  • 過濾查詢已被棄用,並在ES 5.0中刪除。

官方文檔 www.elastic.co/guide/en/el… 2.X版本和5版本,中文官方 www.elastic.co/guide/cn/el…

七、關聯查詢

Elasticsearch多表關聯問題是討論最多的問題之一。ES能夠實現關聯查詢,可是不推薦使用,性能也會有影響。
三種解決方案:

  • nested
  • join,只等關聯同一個類型中的數據
  • 寬表,可能聚合時候出現問題

參考鏈接:blog.csdn.net/laoyang360/…

八、參考連接

九、簡單示例:

創建索引
/lhhb-order
{
    "settings": {
        "number_of_shards": 3,
        "number_of_replicas": 2
    },
    "mappings": {
		"properties": {
		    "cashname": {
		        "type": "keyword"
		    },
		    "memo_no": {
		        "type": "keyword"
		    },
		    "payment": {
		        "type": "double"
		    },
		    "create":{
		    	"type": "date",
		    	"format": "yyyy-MM-dd HH:mm:ss||yyyy-MM-dd||epoch_millis"
		    },
		    "remark":{
		    	"type": "text"
		    }
		}
    }
}

添加數據
/lhhb-order/_doc/1
{
	"cashname": "人民幣",
	"memo_no": "1233455754534",
	"payment": 10000.12345,
	"create":"2015-01-01 23:33:12",
	"remark":"備註啊書法大賽打發士大夫"
}

基本查詢
term是精確查詢
match是模糊查詢
gt : 大於
lt : 小於
gte : 大於等於
lte :小於等於
{
  "query": {
	"bool":{
		"must": [
	        { "range":  { "create": {"gte": "2015-02-01"} }}
	      ]
	}
  }
}
{
  "query": { 
    "bool": { 
      "must": [
        { "match": { "title":   "Search"        }},
        { "match": { "content": "Elasticsearch" }}
      ],
      "filter": [ 
        { "term":  { "status": "published" }},
        { "range": { "publish_date": { "gte": "2015-01-01" }}}
      ]
    }
  }
}

聚合: 分類統計
{
    "size" : 0,
    "aggs" : { 
        "popular_colors" : { 
            "terms" : { 
              "field" : "color.keyword"
            }
        }
    }
}
複製代碼

4、logstash

一、從數據庫讀取數據到ES

安裝插件

logstash-7.3.2\bin 安裝

logstash-plugin install logstash-input-jdbc

目錄下放驅動文件

.conf文件

文件格式UTF-8

input {
  jdbc {
    jdbc_driver_library => "mysql-connector-java-5.1.33-bin.jar"
    jdbc_driver_class => "com.mysql.jdbc.Driver"
    jdbc_connection_string => "jdbc:mysql://IP:3306/test"
    jdbc_user => "root"
    jdbc_password => "****"
    schedule => "*/1 * * * *"
	jdbc_default_timezone => "Etc/UTC"
	statement => "SELECT * FROM biz_transfer_info where id > :sql_last_value"
	jdbc_paging_enabled => "true"
    jdbc_page_size => "50000"
	
	last_run_metadata_path => "E:\cyd\WorkPro\ELK\logstash-7.3.2\logstash-7.3.2\log\mysql_test.txt"
	use_column_value => true
	record_last_run => true
	tracking_column => "id"
    
  }
}

output {
  stdout {
    codec => json_lines
  }
  elasticsearch  {
    hosts => "127.0.0.1:9200"
    index => "mysql_test"
  }
}
複製代碼
啓動

.\logstash.bat -f .\mysqldata.conf

問題:

最好參考官方文檔

  • 兩次執行重複。調整定時時間間隔,最好使用ID控制執行到哪一行了。
  • sql如何處理引號。編寫成文件statement_filepath
  • 可執行存儲過程。
  • SQL字段都須要是大寫否則報錯

5、kibana

一、安裝

官網上的安裝和運行都很簡單。

  • 目前最新的版本支持中文。
  • 安裝後能夠選擇導入測試數據

二、實際應用

  • 起初想使用ES作報表和實時數據的儀表盤,後來發現,報表須要更加複雜的聚合統計和自由靈活的字段拖拽。
  • kibana能夠快速實現簡單的可視化數據展現,能夠快速實現簡單的聚合。
  • 報表的數據提供最終仍是使用Logstash+Elastic方案,存儲ES,如保證明時,還須要數據一致性,更新ES中的數據。從而實現PB級數據,複雜聚合秒查的特性。
  • 實際調用API作複雜查詢的時候,但是查看聚合可視化請求的body做爲例子。

三、目錄

目錄

四、儀表盤

儀表盤

五、聚合可視化

聚合可視化

六、可視化類型

可視化類型

七、參考連接

kibana報表截圖:elkguide.elasticsearch.cn/kibana/phan…

相關文章
相關標籤/搜索