ElasticSearch與Kibana簡介及使用入門

Elasticsearch一款基於Apache Lucene™開源搜索引擎,其核心是迄今爲止最先進、性能最好的、功能最全的搜索引擎庫Lucene。Elasticsearch使用簡單,具有非常強大的全文搜索功能:

  • 分佈式的實時文件存儲,每個字段都被索引並可被搜索
  • 分佈式的實時分析搜索引擎
  • 可以擴展到上百臺服務器,處理PB級結構化或非結構化數據

ElasticSearch中使用到的概念

準實時

Elasticsearch是一個準實時系統:一個文檔從存儲到它能夠被檢索只有一個很短的延遲(通常情況下爲一秒)。

集羣(Cluster)

爲所有數據提供存儲和檢索等服務的結點(服務器)集合。默認的名字爲“elasticsearch”,結點(服務器)也依據名字被指定要加入哪個集羣。

結點(Node)

作爲集羣的一部分,爲數據提供存儲和檢索服務的一臺服務器。

索引(Index)

索引的概念類似於關係數據庫中的數據庫,是相關文檔存儲的地方。相應的,“索引一個文檔”表示把一個文檔存儲在某個索引中。

類型(Type)

索引中文檔的邏輯分類,類似於關係數據庫中的表。

Elasticsearch 6.0.0.已經不支持在一個索引中建立多個類型,在以後版本中會移除類型這一個概念。

文檔(Document)

一條完整的記錄,類似於關係數據庫中的元組。

域(Fields)

類似於關係數據庫中的屬性。

倒排索引

Elasticsearch會爲文檔中的每個字段都建立倒排索引,這是它實現高效搜索的基礎之一。

ElasticSearch類比傳統數據庫

Relational DB Elasticsearch
Databases Indices
Tables Types
Rows Documents
Columns Fields

安裝

Elasticsearch 需要 Java8 或更新的 Java 環境。Java 下載

下載 Elasticsearch 6.0.1 壓縮包並解壓

$ curl -L -O https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-6.0.1.tar.gz
$ tar -xvf elasticsearch-6.0.1.tar.gz

啓動

$ cd elasticsearch-6.0.1/bin
$ ./elasticsearch

如果你不想使用默認的集羣名和結點名,可以在啓動時指定相應的參數:

$ ./elasticsearch -Ecluster.name=my_cluster_name -Enode.name=my_node_name

交互

Elasticsearch啓動後是一個 http 服務,默認在本地的 9200 端口。可以通過 curl 或者 Kibana 控制檯進行操作。使用 curl 的命令格式如下:

$ curl -X<VERB> '<HOST>:<PORT>/<PATH>?<QUERY_STRING>' -d '<BODY>'
  • VERB:HTTP 方法,如 GET、POST、PUT、HEAD、DELETE
  • PROTOCOL:http 或者 https 協議
  • HOST: Elasticsearch集羣中的任何一個節點的主機名,如果是在本地的節點,那麼就叫localhost
  • PORT: Elasticsearch HTTP服務所在的端口,默認爲 9200
  • PATH: API路徑
  • QUERY_STRING: 一些可選的查詢請求參數,例如?pretty參數將使請求返回更加美觀易讀的JSON數據
  • BODY: 一個JSON格式的請求主體(如果請求需要的話)

例. 查詢集羣中結點的健康狀況

$ curl -X GET "localhost:9200/_cat/health?v"
  • 綠色:一切安好
  • 黃色:所有結點均可用,某些結點沒有備份
  • 紅色:某些結點不可用

添加一個名爲“customer”的索引

$ curl -X PUT "localhost:9200/customer?pretty"

查看現有的所有索引

$ curl -X GET "localhost:9200/_cat/indices?v"

在索引“customer”中添加一個 ID 爲 1 顧客的信息,即一個文檔(文檔類型爲 doc)

$ curl -X PUT "localhost:9200/customer/doc/1?pretty" -H 'Content-Type: application/json' -d'
{
  "name": "John Doe"
}
'

查看顧客1的信息

$ curl -X GET "localhost:9200/customer/doc/1?pretty"

將顧客1的姓名改爲 “Jane Doe”

$ curl -X PUT "localhost:9200/customer/doc/1?pretty" -H 'Content-Type: application/json' -d'
{
  "name": "Jane Doe"
}
'

查看顧客1的信息

$ curl -X GET "localhost:9200/customer/doc/1?pretty"

爲顧客1添加一項年齡屬性

$ curl -X POST "localhost:9200/customer/doc/1/_update?pretty" -H 'Content-Type: application/json' -d'
{
  "doc": { "name": "Jane Doe", "age": 20 }
}
'

刪除“customer”索引

$ curl -X DELETE "localhost:9200/customer?pretty"

查看現有的所有索引

$ curl -X GET "localhost:9200/_cat/indices?v"

批處理

_bulkAPI 可以幫助我們一次進行多項操作。添加兩個顧客 John Doe 和 Jane Doe

$ curl -X POST "localhost:9200/customer/doc/_bulk?pretty" -H 'Content-Type: application/json' -d'
{"index":{"_id":"1"}}
{"name": "John Doe" }
{"index":{"_id":"2"}}
{"name": "Jane Doe" }
'

將顧客1的名字改爲 Jane Done, 並刪除顧客2的信息

$ curl -X POST "localhost:9200/customer/doc/_bulk?pretty" -H 'Content-Type: application/json' -d'
{"update":{"_id":"1"}}
{"doc": { "name": "John Doe becomes Jane Doe" } }
{"delete":{"_id":"2"}}
'

查詢

上面已經介紹瞭如何使用 curl 進行簡單的查詢。若要對數據進行復雜查詢與分析,推薦結合使用 Kibana。

kibana簡介

Kibana是一個與Elasticsearch協同工作的開源分析和可視化平臺,Kibana 可以讓你更方便地對 Elasticsearch 中數據進行操作,包括高級的數據分析以及在圖表中可視化您的數據。

安裝

Kibana 的主版本號和次版本號不要超過 Elasticsearch,最好使用同版本號的 Kibana 與 Elasticsearch。

下載 Kibana 6.0.1壓縮包並解壓

$ wget https://artifacts.elastic.co/downloads/kibana/kibana-6.0.1-linux-x86_64.tar.gz
$ tar -xzf kibana-6.0.1-linux-x86_64.tar.gz

啓動

$ cd kibana-6.0.1-linux-x86_64/
$ ./bin/kibana

Kibana 默認運行在 5601 端口,打開瀏覽器訪問 localhost:5601 即可看到 Kibana 控制檯,打開 Dev Tools 便籤欄即可與 Elasticsearch 進行交互。

準備數據

在體驗Kibana之前先讓我們準備一些更加複雜的數據,以便更好地體現出Kibana的效果。官網上有三個數據集可供使用:shakespeare.json、accounts.zip、logs.jsonl.gz。這裏我們選擇其中的accounts.ziplogs.jsonl.gz

下載完成後需要解壓

$ unzip accounts.zip
$ gunzip logs.jsonl.gz

在我們導入數據集前,需要先指定一些數據域的屬性。

logs 數據的結構很複雜,此次示例我們只關心以下幾個域:

{
    "memory": INT,
    "geo.coordinates": "geo_point"
    "@timestamp": "date"
}

在 Kibana的Dev Tools 控制檯中輸入一下命令對其中某些域指定特性:

PUT /logstash-2015.05.18
{
  "mappings": {
    "log": {
      "properties": {
        "geo": {
          "properties": {
            "coordinates": {
              "type": "geo_point"
            }
          }
        }
      }
    }
  }
}

PUT /logstash-2015.05.19
{
  "mappings": {
    "log": {
      "properties": {
        "geo": {
          "properties": {
            "coordinates": {
              "type": "geo_point"
            }
          }
        }
      }
    }
  }
}

PUT /logstash-2015.05.20
{
  "mappings": {
    "log": {
      "properties": {
        "geo": {
          "properties": {
            "coordinates": {
              "type": "geo_point"
            }
          }
        }
      }
    }
  }
}

accounts 數據不需要指定域特性,現在我們已經準備好了,可以向 Elasticsearch 導入數據了,在放有三個解壓好的數據文件的同級目錄下運行以下shell命令:

curl -H 'Content-Type: application/x-ndjson' -XPOST 'localhost:9200/bank/account/_bulk?pretty' --data-binary @accounts.json
curl -H 'Content-Type: application/x-ndjson' -XPOST 'localhost:9200/_bulk?pretty' --data-binary @logs.jsonl

等待數據導入完成,再看一眼是否導入成功:

GET /_cat/indices?v

制定索引模式

在正常的使用過程中,你的Elasticsearch庫中可能有非常多的索引,通過制定一些索引模式(即含有統配符的索引名匹配模板)可以在進行檢索時有效地制定搜索的範圍。在Kibana的 Management 標籤欄下添加新的索引模式,這裏我們添加了兩個索引模式:ba*、logstash*

shakespeare和accounts數據都是沒有時間信息的,所以在添加shakes*和ba*索引模式時“Index contains time-based events box ”一欄應該置爲空,logs數據集帶有時間信息,在添加logstash-*索引模式時在這一項選擇“@timestamp”。

索引模式可以自由制定,但必須保證所添加的索引模式能夠匹配到Elasticsearch中現有的某些索引,並且這些索引中還必須有數據。

在控制檯輸入 GET _cat/indices 可以查看 Elasticsearch中現存的所有索引。

檢索

進入 Kibana 的 Discover 標籤欄,通過在頂部的搜索框中輸入 Elasticsearch 查詢語句可以對數據進行各種檢索。當前使用的索引模式顯示在搜索欄下面,Elasticsearch只會在與當前的索引模式相匹配索引中執行搜索。

舉個例子,將當前的索引模式選擇爲 ba*,並在頂部的搜索欄中輸入:

account_number:<100 AND balance:>47500

來查詢 accounts 數據中 accounts_number 屬性小於100,並且balance屬性大於47500的文檔。

在這裏插入圖片描述

可以看到一共有五條文檔符合我們的檢索要求,Kibana默認會列出所有匹配文檔的所有域,通過將鼠標懸停在相關域點擊後面的“add”按鈕可以要查看的域進行篩選。

數據可視化

在 Kibana 的 Visualize 標籤欄下對你的數據進行可視化。

例:點擊“Create a visualization”新建一個數據視圖。Kibana 提供了多種數據視圖,這裏我們選擇餅圖,再選擇索引模式ba*。

在初始的默認值下,所有的文檔都被匹配上了,所以我們看到的是一個單色的餅圖。這裏我們使用Buckets聚合來將對數據的balance進行一下分析:

1.點擊“Split Slices”按鈕

2.在Aggregation列表中選擇Range選項

3.在Field列表中選擇balance選項

4.通過點擊“Add Range”按鈕,制定6個區間

5.每個區間的範圍值如下

0 999
1000 2999
3000 6999
7000 14999
15000 30999
31000 50000

6.點擊“Apply changes”顯示分析結果

在這裏插入圖片描述

下面讓我進行更進一步的分析,通過以下操作,我們來分析一下每個 balance range中開戶人的年齡分佈情況:

1.點擊bucket列表下的“Add sub-buckets”按鈕,新建一列子buckets

2.點擊“Split Slices”按鈕

3.在Aggregation列表中選擇“Term”選項

4.在Field列表中選擇age選項

5.在Order By中選擇metric:Count選項

6.在Order中選擇Descending,Size默認爲5

7.點擊“Apply changes”顯示分析結果

在這裏插入圖片描述

將鼠標懸停在相關區域可以顯示更多信息,在Custom Label欄中可以爲我們的座標起名字,點擊右上角的Save按鈕可以保存我們的視圖。

下面我們來對log數據進行一些分析:

1.點擊左上角的Visualize按鈕,回到Visualize標籤欄的根目錄,添加一個新的視圖

2.選擇Coordinate Map 視圖

3.選擇logstash-*索引模式

4.點擊右上角的時間信息,打開時間過濾器

5.我們選擇查看2015.5.18到2015.5.20的信息

在這裏插入圖片描述

6.點擊Go按鈕,應用我們的時間過濾器

7.在buckets中選擇Geo Coordinate指定我們要查詢的內容,並點擊Apply changes使查詢生效

在這裏插入圖片描述

Kibana還支持繪製直方圖,折線圖等多種多樣的視圖以及更高級的數據可視化功能。

更多詳情請參考:

Elasticsearch官方文檔

Kibana官方文檔

可能遇到的問題

can not run elasticsearch as root

切換到非root用戶

main ERROR Could not register mbeans java.security.AccessControlException: access denied (“javax.management.MBeanTrustPermission” “register”)

改變elasticsearch文件夾所有者到當前用戶:

$ sudo chown -R user_name elasticsearch
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章