【レポート】Elasticsearch 札幌 Meetupに参加してきた #elasitcsearch

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

こんにちは、せーのです。今日は本日札幌コンベンションセンターで行われるオープンソースカンファレンス北海道2日目に合わせ、その前日に会場隣であるCross x Gardenにて行われた「Elasticsearch 札幌Meetup」に行ってきましたのでそのレポートをしたいと思います。
少人数で密度の濃い、これぞMeetupという楽しい時間が過ごせました。

elk_meetup1

スピーカーはElastic社の大谷 純氏です。

レポート

  • 今回の話は海外ではBBL(Brown Bag Lunch: ランチミーティングの中でも自分で買った軽食を持ち寄りながら話す気軽な会)用に使っているものなので気軽にして欲しい。

Elasticスタック

elk_meetup2

  • Elasticsearchを軸にしてLogstash、Kibanaを合わせてELKと呼ぶ。それに加えて取り込み部をシンプルにした「Beats」とそれをまとめた「X-pack」、それらをクラウド上で動かすための「Elastic Cloud」をまとめて提供する(Elasticスタック)。オープンソース、Elasticの収入源は有料プラグインやサブスクリプションプランとなる。全国でトレーニングも開催中。
  • 実行エンジンはJLBとなるがLogstashはRubyで書かれている(JRuby)。

Logstash

elk_meetup4

  • データをフィルタリング、加工、データの追加や変換等を行って出力する。構造は[Input][Filter][Output]とシンプル。
  • Input
    • 1行1データ。ファイル等を指定する。
  • Filter
    • grok: 必要なフィルタリングを正規表現で書く。大体使いそうな正規表現はパターンとして登録されているのでそれを使えばOK(grok-patterns)。
    • date: タイムスタンプを置き換える
    • geoip: IPアドレスを緯度経度に置き換える
    • agent: ユーザーエージェントを追加する
  • Output
    • S3や各種DB等様々なパターンにアウトプットが可能。複数の出力先に出力することも可能。
    • 出力先毎に出力内容を変えるにはTagやTypeを使ってgrokの段階で選り分ける。if文を使って出力内容を変える。
filter {
  if [path] =~ "access" {
    mutate { replace => { "type" => "apache_access" } }
    grok {
      match => { "message" => "%{COMBINEDAPACHELOG}" }
    }
  }
  date {
    match => [ "timestamp" , "dd/MMM/yyyy:HH:mm:ss Z" ]
  }
}

output {
  # Send production errors to pagerduty
  if [loglevel] == "ERROR" and [deployment] == "production" {
    pagerduty {
    ...
    }
  }
}

Elasticsearch

  • フリーワード検索、絞込、ハイライト、ソート、ページング、集計、サジェスト等検索に必要な物が一通り入っている。オープンソース。設定なしで簡単に試すことが可能。
  • 元々はCEOが料理研究家の奥さんのためにレシピの検索を作ろうとしたのが最初。ちなみにそのレシピの検索はまだ出来ていない。
  • "ElasticSearch"と"S"を大文字で書くのは古いバージョン。
  • スキーマフリー。JSONを入れれば使える。RESTで使える。
  • CRUDが簡単。1行でいける。が、日本語などちゃんと検索したいときはスキーマを作ったほうがいい。
  • 更新作業は中ではdelete-insertをやっている。
  • 内部のデータは_sourceの中に入っているのでそれを使うと良い。

elk_meetup5

  • Solrでは検索はクエリストリングに1行で書かなければならないが、ElasticsearchではJSONでクエリを書くことができる。
  • 分散構成ができる。レプリケーションさせることでSPOFを解消。シャーディングさせてサーバー負荷を分散。
  • クラスタ構成では2台にするとネットワーク分断した時にどちらが正しいかわからないのでやめて欲しい。3以上か推奨。1台でも動く。

検索の基礎

形態素解析

  • 辞書を持っている。単語に出ている順番でスコアをつけられる。語尾が変わっても検索できる。
  • 未知の言葉など辞書に載っていない単語は対応できない

N-Gram

  • 決められた文字数毎に分けていく。未知語に対応する。

  • この2つをorで結んで、一般的に意味の通る形態素解析のスコアを上の方に持ってくる、というのが一般的な検索。

Analyzer

  • Char filter: タグを消せる
  • Tokenizer: トークン列に分割する
  • TokenFilter: トークンごとにフィルターする(小文字化とか)

  • Mapping: どのフィールドがどのアナライザーを使うかを決める。一度定義したMappingを後で定義するのは結構大変。

その他の機能

  • GEO - 半径で検索、グルーピングができる
  • Percolator - 検索条件を定義しておいて、合致するデータがきたら返す。RSS等のデータをカテゴリを絞って通知する時などに使う。
  • Snapshot/Restore

Aggregation

  • 多段で集計結果がかける。Solrはひとつ

elk_meetup6

Kibana 4

  • Node.js & JavaScriptで書かれている。(Kibana 3はHTML5 + JavaScriptだったがサーバー出力に変更)
  • GUIをプラグインとして公開

Beats

  • Goで書かれている。
  • パケットを取り出してElasticsearchに乗せられる。パケットを指定するだけでできる。
  • 取る項目がBeatごとに決まっている。=> Kibanaのテンプレもある

    elk_meetup8

  • Hadoopに追加するとHiveやpigの受け取り先にElasticsearchが使える

  • データを取り出してElasticsearchに投げる、という部分ではLogstashと同じだが、クライアントで動かすにはLogstashはやや重い。Beatsであればそこがサクッと動かせる。ただラズパイとかでサクサク動かせるかはやってみてください。

    • Beats: 軽量、単機能
    • Logstash: リッチ、多機能
  • Beatsで取り出してLogstashに投げて整形、加工してElasticsearch、という流れ

商用ツール

Shield - ユーザー認証がないのでアクセスコントロールする時に使う。SSL/TLS, IPフィルター。 Watcher - アラーティングする。アクションの条件を設定する。

Elasticスタック 5.0

elk_meetup9

  • Elasticのリリースは日付を統一したものの、各サービスによってバージョンが違いわかりにくい
  • そこで全て統一して5.0から振り直す(今秋)。

elk_meetup10

Elasticsearch v5.0

  • ingest node: 前処理がElasticsearch に入れられる。LogstashのFilterのような処理をElasticsearchに入れられるのでBeatsから直でElasticsearchに投げて加工、という流れが作れる。
  • Painless Scripting: 独自のスクリプト言語。最初はJavaScriptでスクリプトを書いたがフルオープンになってしまう、という課題があった。そこでgroovyでかけるようにしたが今度はgroovyにセキュリティホールが発覚。結果自分たちでスクリプトを作った。
  • Kuromoji: 形態素解析の解析が複数出して登録できる、というのがLUCENEに入ったのでElasticsearchにもそのまま載せることができる。「秘書室長谷川さん」が「ひしょしつ はせがわさん」でも「ひしょしつちょう たにがわさん」でも検索できるように。
    • 漢数字を数字に変換できるようになった。一〇〇〇 => 1000
  • その他pluginの前にプロダクト名が入るようになった、IPv6対応など。

Kibana 5

elk_meetup11

  • 見た目が変わった。アイコンなくなった。上のバーは左に寄った。プラグインは並列に並ぶようになった。
  • senseは"console"という名前でKibana本体に組み込めるようになった。

Logstash v5.0

  • Monitorig API: Logstash自身の情報がモニタリングできるようになった。
  • GeoIP2になった。緯度経度情報の項目が増えた。
  • plugin generator: 簡単に書けるようになった。

beats

  • 取込部が1行じゃなくてJSONならパースしてから取り込めるようになった。
  • topbeat => trickbeatに改名

X-pack

  • ダウンロードのzipがスタックでひとつになる。

その他

  • Shieldの登録がgui化。
  • Kibanaがpdfでダウンロードできる。

Q&A

スペックはどれくらいを想定する?

サイジングは非常に難しい。ただこのデモで手元のmac上で動いている(メモリ割り当て4GB)。ドキュメントの数がファイルで検索や出し入れをやっているのでそのままサイジングに影響する。

より自然な言語による検索を実現するには。「札幌駅の近くのお店」など

東大のデータベースや商用データベースを使って地名を緯度経度に一旦変換してからElasticに突っ込むと良い。固有表現抽出モジュール等を使って地名や日時を割り出すと面白い。

まとめ

いかがでしたでしょうか。少人数でリラックスした雰囲気の中、ざっくばらんなディスカッションができてとても楽しかったです。みなさんのお近くでもMeetUpがあった時には参加してみてはいかがででしょうか。