Elastic Stack 5.2.0 がリリースされました
おはようございます、藤本です。
1/31 に Elastic Stack 5.2.0 がリリースされていました。Elastic Stack 5.1.1 のリリースから 2ヶ月弱と相変わらずな早さのリリースペースにも関わらず、多くの新機能、バグフィックスが含まれていました。
今回はいくつか新機能を触ってみましたので、メモ書きします。それではプロダクト別に順にご紹介します。
Elasticsearch 5.2.0
まずは Elasticsearch です。Elasticsearch 5.2.0 の公式ブログと、リリースノートは以下になります。
- 公式ブログ
- リリースノート
数値/日付の範囲フィールド追加
数値、および日付の範囲フィールドが追加されました。追加された範囲フィールドは以下となります。
- integer_range
- float_range
- long_range
- double_range
- date_range
範囲フィールドは range クエリのような構文で始まりの値、終わりの値を保持することができます。始まりの値は値を含むgte
、含まないgt
、終わりの値は値を含むlte
、含まないlt
で設定します。範囲フィールドに対して、range クエリを実行することでクエリした範囲に含む、クエリした範囲を含むドキュメントなど柔軟に検索することができるようになりました。含む、含まないは
例えば、下記のクエリでは日付フィールドを利用することで、インデックスされたスケジュール情報に対して、指定した時間範囲に、特定の場所にいるユーザーを取得することができます。
# curl -XPUT localhost:9200/daterange { "mappings": { "type": { "properties": { "name": { "type": "keyword" }, "place": { "type": "keyword" }, "date": { "type": "date_range" } } } } } { "acknowledged": true, "shards_acknowledged": true } ### スケジュール登録 # curl -XPOST localhost:9200/daterange/type { "name": "fujimoto", "place": "office", "date": { "gte": "2017-02-03T09:00:00Z", "lte": "2017-02-03T18:00:00Z" } } # curl -XPOST localhost:9200/daterange/type { "name": "fujimoto", "place": "office", "date": { "gte": "2017-02-02T09:00:00Z", "lte": "2017-02-02T18:00:00Z" } } # curl -XPOST localhost:9200/daterange/type { "name": "mesoko", "place": "home", "date": { "gte": "2017-02-03T09:00:00Z", "lte": "2017-02-03T18:00:00Z" } } ### 12時〜13時に office にいるユーザーを検索 GET daterange/_search { "query": { "bool": { "must": [ { "range": { "date": { "gte": "2017-02-03T12:00:00Z", "lte": "2017-02-03T13:00:00Z", "relation": "contains" } } }, { "match": { "place": "office" } } ] } } } { : "hits": { "total": 1, "max_score": 1.287682, "hits": [ { "_index": "daterange", "_type": "type", "_id": "AVoNz21qAfJp6UvKYEdX", "_score": 1.287682, "_source": { "name": "fujimoto", "place": "office", "date": { "gte": "2017-02-03T09:00:00Z", "lte": "2017-02-03T18:00:00Z" } } } ] } }
Keyword フィールドへのフィルタ適用
string
フィールドはElasticsearch 5系から、アナライザーが適用されるtext
フィールド、アナライザーが適用されないkeyword
フィールドに分けられました。keyword
フィールドに対してはアナライザーが適用されないため、クエリには完全な一致が求められる状況でした。そこで今回のリリースの Normalizer です。Normalizer では Character Filter、Token Filter を実装することができます。Tokenizer が設定できない Analyzer と理解していいのかな。それによりkeyword
フィールドにフィルタを適用することで柔軟に検索できるようになりました。
例えば、下記のクエリでは、keyword
フィールドの場合、アルファベットは大文字小文字が合っていないとクエリにヒットしませんが、lowercase フィルタを適用した Normalizer を適用することでクエリにヒットさせることができます。
### Nomarlizer を定義したインデックス作成 # curl -XPUT localhost:9200/normalizer { "settings": { "analysis": { "normalizer": { "norm": { "type": "custom", "filter": ["lowercase"] } } } }, "mappings": { "type": { "properties": { "name": { "type": "keyword", "normalizer": "norm" } } } } } { "acknowledged": true, "shards_acknowledged": true } ### 先頭だけ大文字でインデックス # curl -XPOST localhost:9200/normalizer/type { "name": "Fujimoto" } { "_index": "normalizer", "_type": "type", "_id": "AVoN7wBSAfJp6UvKYEde", "_version": 1, "result": "created", "_shards": { "total": 2, "successful": 1, "failed": 0 }, "created": true } ### 全部大文字でクエリ # curl localhost:9200/normalizer/_search { "query": { "match": { "name": "FUJIMOTO" } } } { : "hits": { "total": 1, "max_score": 0.2876821, "hits": [ { "_index": "normalizer", "_type": "type", "_id": "AVoN7wBSAfJp6UvKYEde", "_score": 0.2876821, "_source": { "name": "Fujimoto" } } ] } }
Terms アグリゲーションのパーティショニング
Terms アグリゲーションは同じ値の件数を集計する機能です。今まで Terms アグリゲーションは多くのドキュメント、フィールドの長いテキストを扱う際に多くのメモリを消費していました。パーティショニング機能の実装により、ページングのように一部集計結果を取得したり、サブアグリゲーションへ引き渡したりすることが可能となりました。
例えば、下記のクエリでは、Elastic が提供するシェイクスピアのサンプルデータの text_entry に terms アグリゲーションの結果をパーティショニングしています。
### 100 分割にパーティショニングした 1パーティション目 # curl localhost:9200/shakespeare/_search { "size": 0, "aggs": { "partition": { "terms": { "field": "text_entry.keyword", "include": { "partition": "0", "num_partitions": "100" }, "order": { "_count": "desc" } } } } } { : "aggregations": { "partition": { "doc_count_error_upper_bound": 5, "sum_other_doc_count": 1093, "buckets": [ { "key": "BISHOP", "doc_count": 23 }, { "key": "[To KING RICHARD III]", "doc_count": 9 }, { "key": "Ist possible?", "doc_count": 7 }, { "key": "Agreed.", "doc_count": 2 }, { "key": "Ay,", "doc_count": 2 }, { "key": "Descends", "doc_count": 2 }, { "key": "Harry of Hereford, Lancaster and Derby,", "doc_count": 2 }, { "key": "SCENE I. London. The palace.", "doc_count": 2 }, { "key": "A goodly day not to keep house, with such", "doc_count": 1 }, { "key": "A lad of life, an imp of fame;", "doc_count": 1 } ] } } } ### 100 分割にパーティショニングした 2パーティション目 # curl localhost:9200/shakespeare/_search { "size": 0, "aggs": { "partition": { "terms": { "field": "text_entry.keyword", "include": { "partition": "1", "num_partitions": "100" }, "order": { "_count": "desc" } } } } } { : "aggregations": { "partition": { "doc_count_error_upper_bound": 5, "sum_other_doc_count": 1102, "buckets": [ { "key": "ACT III", "doc_count": 36 }, { "key": "Strikes him", "doc_count": 5 }, { "key": "Not I.", "doc_count": 4 }, { "key": "A horse! a horse! my kingdom for a horse!", "doc_count": 2 }, { "key": "Enter ALBANY", "doc_count": 2 }, { "key": "Enter LADY MACBETH", "doc_count": 2 }, { "key": "Enter Thisbe", "doc_count": 2 }, { "key": "I have done.", "doc_count": 2 }, { "key": "To GONERIL", "doc_count": 2 }, { "key": "A Talbot! a Talbot! cried out amain", "doc_count": 1 } ] } } }
Kibana 5.2.0
続いて、Kibana です。Kibana 5.2.0 の公式ブログと、リリースノートは以下になります。
- 公式ブログ
- リリースノート
ヒートマップによる可視化追加
可視化の方法にヒートマップが追加されました。今まで Kibana でヒートマップを利用したい場合、Elastic 社公式ではないプラグインにより利用することもできました。Kibana 5.2.0 から Elastic 社公式のヒートマップが標準実装され、利用できるようになりました。
より直感で比較することができそうですね。
タグクラウド
5.2.0 からではないですが、5.1.1 ではタグクラウドが追加されていました。
おしゃれ(雑
タイルマップの拡張
Kibana のタイルマップはバージョン 4.5.3 から Elastic 社が提供する Elastic Tile Service を利用するようになりました。ただ Elastic Tile Service はズームレベル 8 までしか対応していませんでした。公式ドキュメントには 10 と記載がありますが、8 だったはず。経緯は下記エントリに少し記載しています。
Kibana/X-Pack 5.2.0 からズームレベル 12 まで対応しました。X-Pack は無償のベーシックライセンスでOKです。
ズームレベルの 8 と 12 では下記のような差があります。
ズームレベル 8
ズームレベル 12
結構違いますよね。今後、ズームレベル 18 を目指しているようです。
Logstash
続いて、Logstash です。Logstash 5.2.0 の公式ブログと、リリースノートは以下になります。
- 公式ブログ
- リリースノート
Monitoring による Logstash のステータス監視
X−Pack の Monitoring により Kibana の UI から Elasticsearch をステータスを可視化できていました。バージョン 5.0.0 からは Kibana のステータス可視化が追加されました。バージョン 5.2.0 からは Logstash のステータス可視化も追加されました。
Logstash はバージョン 5.0.0 から Monitoring API が追加され、API によりステータスを取得できるようになりました。今回のアップデートでは Monitoring API を Kibana の UI で可視化できるようになりました。
Logstash のステータス可視化には以下のステップが必要です。
- Logstash への X-Pack インストール
- Logstash への Monitoring 利用設定
Logstash への X-Pack インストール
Logstash への X-Pack インストールはその他プラグインと同様にインストールできます。
# cd /usr/share/logstash/ # ./bin/logstash-plugin install x-pack OpenJDK 64-Bit Server VM warning: If the number of processors is expected to increase from one, then you should configure the number of parallel GC threads appropriately using -XX:ParallelGCThreads=N Downloading file: https://artifacts.elastic.co/downloads/logstash-plugins/x-pack/x-pack-5.2.0.zip Downloading [=============================================================] 100% Installing file: /tmp/studtmp-0280f342de5fac8d0561d54bff5c2fe18c46a67d2ffa6fc0f1d95921a935/x-pack-5.2.0.zip Install successful # ./bin/logstash-plugin list |grep x-pack x-pack
Logstash への Monitoring 利用設定
Logstash の設定ファイルにステータス情報をインデキシングする Elasticsearch の情報を設定します。
# vi /etc/logstash/logstash.yml xpack.monitoring.elasticsearch.url: "http://localhost:9200" xpack.monitoring.elasticsearch.username: "logstash_system" xpack.monitoring.elasticsearch.password: "changeme"
設定したら、Logstash を再起動します。
# systemctl restart logstash
Monitoring UI
それでは Kibana を確認してみましょう。
Monitoring を選択します。
Logstash Monitoring用インデックスがない時は表示されませんが、インデキシングされたら表示されます。
Overview ではイベント数や、イベント当たりの平均処理実行時間、レイテンシが表示されます。
Node ではノード当たりのイベントステータス、JVMが消費するヒープサイズ、CPU使用状況が表示されます。
Beats
続いて、Beats です。Beats 5.2.0 の公式ブログと、リリースノートは以下になります。
- 公式ブログ
- リリースノート
Beats ファミリーに Heartbeat の追加(Beta)
ちょっと前から Github リポジトリには追加されていた Heartbeat の Beta版がリリースされました。Heartbeat はその名の通り、対象の生存を監視します。監視には、ICMP / TCP / HTTP の 3つのタイプがあります。
- ICMP : 対象のIPアドレス宛に ICMP Echo リクエストを送信し、返ってくるかを監視します
- TCP : 対象のIPアドレス、ポート宛に TCP 接続を張れるかを監視します
- HTTP : 対象の URL に HTTP リクエストにレスポンスがあるか監視します
インストール
今回は CentOS 7 にインストールしています。Yumリポジトリは登録済み。
# yum install -y heartbeat : ============================================================================================ Package Arch Version Repository Size ============================================================================================ Installing: heartbeat x86_64 5.2.0-1 elasticsearch-5.x 8.1 M Transaction Summary ============================================================================================ Install 1 Package : Installed: heartbeat.x86_64 0:5.2.0-1 Complete!
Heartbeat の設定
ICMP、TCP、HTTP を全て設定してみます。
heartbeat.monitors: - type: icmp schedule: '@every 5s' hosts: ["10.255.0.101"] - type: tcp schedule: '@every 5s' hosts: ["10.255.0.101:9200"] check.send: "Check" check.receive: "Check" - type: http schedule: '@every 5s' urls: ["http://10.255.0.101:9200/"] check.response.status: 200 output.elasticsearch: hosts: ["localhost:9200"]
動作確認
ICMP、TCP、HTTP それぞれでどんな値が取れるのか確認してみます。
ICMP
TCP
HTTP
ES-Hadoop
最後に ES-Hadoop です。ES-Hadoop 5.2.0 のリリースノートは以下になります。
Spark 2.1 がサポートされたようですが、よく分からない。。
まとめ
いかがでしたでしょうか?
ザーッと、Elastic Stack 5.2.0 の新機能をいくつか試してみました。今回紹介した機能以外にも多くの新機能がリリースされているので是非リリースノートをご確認ください。個人的には案件で Tilemap のズームレベルが低いことで困っていたので、高ズームできたことが嬉しかったです。