Macに kibana + elasticsearch を導入してみた

背景

個人的には Data visualization に興味がありまして、数年前には Visual Complexity を買って読んでみたり、 d3.js を使ったwebサイトなども作成したことがありました。

Data visualization の面白さは、
* なんとなくそうかなと思っていたことを具体的な数値で比較することができる(その結果、思っていたよりも変わっていないことも確認できる)
* 事前知識の異なる人にも何となく現状を理解してもらい、意思決定に役立たせることが可能
という点にあるかなと思います。

ただ、データの整形などの準備に時間がかかったり、ツールによって表現できる種類が限られていたりするので、そこら辺を手際よく使いこなせるとビジネス的にも美味しいわけです。
むろん、大概のデータは Excel で済むことがあるので、手っ取り早くグラフ化したい場合は Excel を使ったり、ネットワークグラフや地図グラフであれば、d3.js を使うと簡単に表現できたりします。
しかし、ログデータを代表とする時系列データは、新しい情報を確認することが重要であるため、Elasticsearch & Kibana のようなツールが必要となってきます。

Elasticsearch と Kibana

Elasticsearch については、gihyoの記事 に概要がまとめられています。Apache Lucene という Javaで動作する全文検索ライブラリをベースにしているのが特徴です。Lucene は英語の検索を元に考えられているため、空白による単語の区切りがない日本語では、形態素解析を行ってから検索するプラグインの導入(Kuromoji, lucene-gosen)が必要となるようです。

Kibana はこちらのブログ にも説明されていますが、時系列データの visualization ツールです。視覚化する際に範囲検索や曖昧な検索を行うために、Elasticsearchを利用するのですね。

セットアップ

elasticのサイトにチュートリアルがあるため、こちらを行います。
2016/12/25 時点で最新バージョン(Elasticseach 5.1.1, Kibana 5.1.1) を使います。

Elasticsearch(& Java SE )のインストールと起動

Homebrew をインストールして、brew コマンド経由でパッケージをインストールしていきます(MacPortsぇ…)。
Elasticsearch を brew installしようとすると、Mac にはデフォルトで Javaのランタイムが入っていないので、

というエラーが出ます。そこで、oracleのページ から Java SE 8 をダウンロードして、インストールします。
そして、Elasticsearchをインストールします。

インストールが無事に終わり、Elasticsearchを起動すると以下のようなログが表示されます。

elasticsearch 起動ログ

Kibanaのインストール

Kibanaもbrewでインストールします。

インストール後に、Kibanaを起動すると以下のようなログが表示されます。

kibana 起動ログ

このとき、elasticsearch を起動していないと、以下のエラーが発生します。

デフォルトの設定で、Kibana は localhost:9200 を見ているので、9200ポートにElasticsearchがないと REST API による連携が行えないということですね。
(最近、Cloud Foundry cliやその他のライブラリでもGUIではなく、APIとして REST を提供する例をよく目にします。何だかんだhttpsで暗号化したりできたり、どの言語からも使えたりするのが便利ですねー)

ElasticsearchとKibanaにブラウザからアクセスしてみる

まずは Elasticsearch (http://localhost:9200)

Kibana (http://localhost:5601)

サンプルデータを入力

さて、elasticのチュートリアル Getting Started からサンプルデータを取得します。今回は、サイズがあまり大きくない Shakespeare のデータを使ってみました(ログを試してみたい方は別のログデータセットがあります)。

データの中身はこんな感じ

さて、まずはデータの形式を Elasticsearch に教える必要があります。ターミナルから以下のコマンドを入力します。

上記コマンドは、jsonデータにデフォルトでどんなプロパティがあるのかを定義しています。 not_analyzed は”speaker”キーにデータが複数入っていても一つの塊として認識するオプションです。非構造データの場合は指定するとよいのでしょう。
余談ですが、位置情報のための型も用意されており、 “type”: “geo_point” を指定すると地図に緯度経度の表示を行います。

さて、サンプルデータをまとめて Elasticsearch にアップロードするため、

を実行します。(中のデータがターミナルを流れていきます…)
ちゃんとデータがはいったかどうかは、

で確認できます。

インデックスの指定と Visualize

ようやく可視化と言いたいのですが、次はKibanaから Elasticsearchに入れたデータのインデックスを指定する必要があります。
このインデックスの説明が厄介で、初回起動時は何かと思ったのですが、このページ を読んで納得しました。要はjsonデータの “_index” という項目に “log20161225” と入っていたとして、これでフィルタリングをかけられるということですね。 logだと汎用的すぎて正規表現が難しくなるので、区別しやすい _index にしましょう。

Shakespeare データは _index に shakespeare と入っているので、 shake* をインデックスとして指定しましょう。
このとき、Shakespeareデータのインデックスに時間情報が含まれていないので、KibanaのGUIで時系列データのチェックボックスをオフにする必要があります

インデックスを指定すると以下のビューになります。

ここまで設定できれば、あとは Discover タブでフィルタリング、Visualize タブで可視化できます。それぞれ色んなオプションがありますが、可視化はこちらのページ が詳しそうです。
今回は、Pie Chart で Term をバケットとして設定して、劇の名前別に数を見てみました。

まとめ

  • Elasticsearch にちゃんとデータの形式を教えてあげる
  • Kibana にインデックスを教えてあげる
    ことがコツかなと思いました。

余談

こうした時系列データのVisualization tool での競合は、Splunk になるのでしょうか。Splunk は内部的に MapReduceを使っている と説明しているのですが、何かOSSを利用しているのでしょうか。
Splunkも利用する機会が多いので、そのうち記事にするかもですー(Splunkはクエリがいまいち分からないんですよね…)

参考URL

elastic

参考図書

ビジュアライゼーション系の図書はライブラリの更新が激しくて、すぐに古くなっちゃうのですが、ロギングシステムはそれほど変わらないのでご参考までに。

投稿者: amasuda

都内で働く新米 IT エンジニア。いかに楽して生活できるかを真剣に取り組む。 夢は人工知能が生活基盤を支え、生活コストのかからない社会の実現。 座右の銘は「なにごとにもこだわらない」github: https://github.com/Go-zen-chu 趣味 :Ukulele / Guitar / Traveling / Photo / Reading books / Bouldering 技術的興味:Artificial Intelligence / Machine Learning / Data Mining / PaaS / Cloud Foundry 言語: Python3 / Go / JavaScript / C# / C++ / Java / PHP / VBA / Ruby

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

CAPTCHA