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 社公式のヒートマップが標準実装され、利用できるようになりました。

Kibana

より直感で比較することができそうですね。

タグクラウド

5.2.0 からではないですが、5.1.1 ではタグクラウドが追加されていました。

Kibana 2

おしゃれ(雑

タイルマップの拡張

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

Kibana 3

ズームレベル 12

Kibana 4

結構違いますよね。今後、ズームレベル 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 のステータス可視化には以下のステップが必要です。

  1. Logstash への X-Pack インストール
  2. 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 を選択します。

Monitoring_-_elasticsearch_-_Overview

Logstash Monitoring用インデックスがない時は表示されませんが、インデキシングされたら表示されます。

Monitoring_-_elasticsearch_-_Overview 2

Overview ではイベント数や、イベント当たりの平均処理実行時間、レイテンシが表示されます。

Monitoring_-_elasticsearch_-_Logstash

Node ではノード当たりのイベントステータス、JVMが消費するヒープサイズ、CPU使用状況が表示されます。

Monitoring_-_elasticsearch_-_Logstash_-_localhost_localdomain

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

Kibana 6

TCP

Kibana 8

HTTP

Kibana 5

ES-Hadoop

最後に ES-Hadoop です。ES-Hadoop 5.2.0 のリリースノートは以下になります。

Spark 2.1 がサポートされたようですが、よく分からない。。

まとめ

いかがでしたでしょうか?

ザーッと、Elastic Stack 5.2.0 の新機能をいくつか試してみました。今回紹介した機能以外にも多くの新機能がリリースされているので是非リリースノートをご確認ください。個人的には案件で Tilemap のズームレベルが低いことで困っていたので、高ズームできたことが嬉しかったです。