はじめに
企業において、データの可視化(Visualization)の重要性が取り上げられ、今注目されています。WebサイトやECサイトを運営しているのであれば、サーバーのアクセスログには、現在までの顧客の活動記録といった膨大な量のデータが蓄積されており、顧客がどんなキーワードで自社サイトにたどり着いたのか、どんな商品を購入していったのかなど、その内容は多岐にわたります。そのデータを分析することで、新たな発見につながり、そこから生まれた新たな価値をユーザーに提供することも可能になるのではないでしょうか。
このように簡単に言ってはいますが、こういった膨大な量のデータを分析するのは容易ではありません。データを可視化し、活用するためには、
- 大量のデータを保持するためのデータウェアハウス(Data Warehouse、以下「DWH」)
- データを外部データソースから抽出、変換・加工、DWHへ保存する柔軟な処理が行えるETL(Extract/Transform/Load)ツール
- 蓄積されたデータに対してアドホッククエリを利用してデータを可視化できるフロントエンド
などの機能を実装する必要があります。
これらをフルスクラッチでシステム開発、安定運用できるようになるまでには、非常に多くの時間が必要となるでしょう。しかし、オープンソースソフトウエア(Open Source Software、以下「OSS」)を利用することで、そのコストを大幅に削減できます。
ここでは、OSSを使用して、カスタマイズ可能なデータ可視化プラットフォームを構築する方法を、実装手順を記載しながら紹介したいと思います。
1. システム構成
サーバーへのログイン権限のないアナリストがいたとします。そのアナリストがユーザーのサイト利用動向を調査しようとした場合、サーバーへのログイン権限を持つ運用エンジニアに依頼して、その時点のログファイルを回収してもらいます。膨大な量のアクセスログを、アナリストは解析(パース)して、必要なデータを抽出、表計算ソフトで読み込める形式に加工、ファイルへ出力します。その後、ファイルを表計算ソフトに読み込ませ、集計やグラフの描画、データの可視化を行います。
単純な集計処理であっても、条件を変えていろいろなパターンを調査するとなると非常に非効率で、時間を浪費してしまいます。ましてや、この行程の中で一つでも作業を間違ってしまった場合、最初からやり直さなければならないといったこともあります。
こういった作業を効率よく行うための製品として、最近ではElastic社(以下「Elastic」)の提供するELK Stack(Elasticsearch、Logstash、Kibana )が有名ですが、ここでは、Apacheソフトウエア財団(Apache Software Foundation、以下「ASF」)のApache Solr (以下「Solr」)、Apache Flume(以下「Flume」)とLucidworks社(以下「Lucidworks」)のOSSであるBananaを組み合わせて、カスタマイズ可能なデータ可視化プラットフォームの構築方法を、実装手順を記載しながら紹介したいと思います。
今回は図1のような、Webサイトのアクセスログに対し、Flumeを使ってデータを抽出・加工し、Solrへロード、Bananaでデータの可視化を行うシステム構成のデータ可視化プラットフォームを構築します。これによりアナリストはエンジニアに余計な仕事を依頼することもなく、GUIを使ってアドホッククエリを簡単に作成し、素早くユーザーの利用動向を調査可能です。しかも、Near Real-Time(ほぼリアルタイム)にデータの可視化を行えるようになります。
1.1 Solrとは
ASFが開発する、OSSの全文検索サーバーです。Javaで記述されており、Java Virtual Machine(以下「JVM」)が実行可能な環境であればSolrを起動することができます。コアにはApache Lucene(以下「Lucene」)を採用し、ファセット、ハイライト、グルーピングなどの強力で柔軟な検索機能を提供します。多言語対応されており、日本語の文書も扱うことが可能です。キーワードによる全文検索に加え、地理空間検索なども行える検索エンジンです。
データ可視化プラットフォームのアドホッククエリを受け付け結果を返すDWHとしての役割を担います。
1.2 Flumeとは
ASFが開発する、OSSのデータコレクタで、大量に出力されるログなどのデータを、効率よく収集、集約、転送することが可能です。ローカルファイルシステムや、Twitter Streaming APIなど、多くのデータソースに対応しており、Morphlineというデータ処理パイプラインを使用することでデータの加工も可能です。特にHDFSやHBaseなどのHadoop 製品との親和性が高い製品です。
データ可視化プラットフォームのETL(データの抽出、加工・変換、ロード)ツールとしての役割を担います。
1.3 Bananaとは
Bananaとは、Elasticが開発するOSSであるKibanaを、Solr向けにポーティングした、Lucidworksが開発するOSSのデータ可視化フロントエンドアプリケーションです。
JavaScriptフレームワークにはAngularJS、可視化ライブラリにはD3.jsが使用されています。Bananaにはサーバーサイドの処理は一切含まれておらず、ソースはすべてHTMLとCSS、JavaScriptで記述されており、クライアントサイド(ブラウザー上)で処理が行われます。Dashboardの設定については、ファイル、ブラウザーのCookie、Gist、Solr上に保存することが可能です。
データ可視化プラットフォームのアドホッククエリを発行するGUIとしての役割を担います。
2. Solrのセットアップ
データ可視化プラットフォームのDWHとクエリ処理としての役割を担うSolrのセットアップを行います。
2.1 Solrのインストール
SolrはASFのプロジェクトサイト、またはアーカイブサイトからダウンロード可能です。
ホームディレクトリ($HOME)下にsolrディレクトリを作成し、Solrをダウンロードします。
$ mkdir $HOME/solr $ wget -P $HOME/solr http://archive.apache.org/dist/lucene/solr/4.10.4/solr-4.10.4.tgz
次にSolrのインストールです。ダウンロードした圧縮ファイルを展開するとインストールは完了です。環境変数$SOLR_HOMEの設定も併せて行います。
$ tar xvzf $HOME/solr/solr-4.10.4.tgz -C $HOME/solr $ export SOLR_HOME=$HOME/solr/solr-4.10.4
2.2 Solrの設定
起動するSolrの準備を行います。サンプルのexampleディレクトリを元にvisualizationディレクトリを作成し、必要な設定を行っていきましょう。
$ cp -r $SOLR_HOME/example $SOLR_HOME/visualization
2.3 スキーマレスモードの適用
データ可視化プラットフォームでは、入力されてくるあらゆるデータに対応できるようにする必要がありますので、Solrにスキーマレスモードの設定を適用してみたいと思います。スキーマレスモードとは、RDBMSのようにテーブル定義をあらかじめ、しっかりと決めるのではなく、入力されてくるデータによって、動的にフィールド名やデータ型をスキーマに反映するデータドリブンのための機能です。
もともとの設定やその他のファイルが収められているsolrディレクトリをsolr_backupとリネームし、用意されているスキーマレスモードのサンプル(example-schemaless/solr)をコピーしましょう。
$ mv $SOLR_HOME/visualization/solr $SOLR_HOME/visualization/solr_backup $ cp -r $SOLR_HOME/visualization/example-schemaless/solr $SOLR_HOME/visualization/.
2.4 コレクションの設定
次にコレクションの設定です。コレクションとはSolrの設定とデータのセットのことを指します。デフォルトではcollection1という名前ですが、分かりやすくするためにhttpd_logsと変更したいと思います。
collection1ディレクトリをhttpd_logsへリネームし、core.propertiesをリスト1のように編集します。
$ mv $SOLR_HOME/visualization/solr/collection1 $SOLR_HOME/visualization/solr/httpd_logs $ vi $SOLR_HOME/visualization/solr/httpd_logs/core.properties
name=httpd_logs
2.5 schema.xmlの編集
続いてschema.xmlの編集を行います。schema.xmlとは、RDBMSでいうところのテーブル定義のようなものがXMLで記述されているファイルです。デフォルトではschema.xmlのschema名がexampleとなっています。そのままでも問題ありませんが、分かりやすく、httpd_logsに修正します。また、データを時間でソートするためのevent_timestampというフィールド(multiValued=false)をBananaがデフォルトで使用しますので、schema.xmlにあらかじめ追加しておきます。リスト2にschema.xmlの抜粋を記載します。
$ vi $SOLR_HOME/visualization/solr/httpd_logs/conf/schema.xml
... <schema name="httpd_logs" version="1.5"> ... <field name="id" type="string" indexed="true" stored="true" required="true" multiValued="false" /> <field name="_version_" type="long" indexed="true" stored="true"/> <field name="event_timestamp" type="tdates" multiValued="false" /> ...
2.6 solrconfig.xmlの編集
さらにsolrconfig.xmlの編集です。Solrの設定はこのsolrconfig.xmlに集約されています。
まず、Solrのインデックス作成時に自動でコミットするように設定します。アクセスログは常に流れてくるので、定期的にSolrでコミットをする必要がありますが、この処理をSolr側で自動で行うようにします。また、未知のフィールドをスキーマに追加する際、デフォルトのフィールドタイプをtext_generalからstringへ変更します。text_generalからstringへ変更した理由としては、今回はテキストのトークナイズなどの解析処理を必要としないシンプルなデータ可視化を想定しているためです。用途によってtext_general、日本語を扱うのであればtext_jaといったフィールドタイプを選択してもよいでしょう。リスト3にsolrconfig.xmlの抜粋を記載します。設定項目の詳細については下記リンクを参照してください。
$ vi $SOLR_HOME/visualization/solr/httpd_logs/conf/solrconfig.xml
... <autoCommit> <maxTime>15000</maxTime> <openSearcher>true</openSearcher> </autoCommit> ... <autoSoftCommit> <maxTime>1000</maxTime> </autoSoftCommit> ... <updateRequestProcessorChain name="add-unknown-fields-to-the-schema"> ... <processor class="solr.AddSchemaFieldsUpdateProcessorFactory"> <str name="defaultFieldType">string</str> ... </processor> ...
以上で、データ可視化プラットフォームのDWHとしてSolrを利用する際の設定は完了です。
3. Bananaのセットアップ
データ可視化プラットフォームのGUIやアドホッククエリの発行、グラフ描画など、まさに可視化の部分を担うBananaのセットアップを行います。
すでに説明しましたが、Bananaには一切サーバーサイドの処理は含まれておらず、すべてクライアントサイド(ブラウザー上)で実行されますので、HTML、CSS、JavaScriptを配信できるHTTPサーバー上にインストールできます。別途Webサーバーを用意してそちらにインストールしてもよいのですが、今回はSolrに同梱されているJetty上にインストールしたいと思います。
3.1 Bananaのダウンロード
BananaはLucidWorksのGitHubからダウンロードすることができます。ホームディレクトリ($HOME)下にbananaディレクトリを作成し、Bananaをダウンロードします。
$ mkdir $HOME/banana $ wget -P $HOME/banana https://github.com/LucidWorks/banana/archive/v1.5.0.zip
3.2 WARファイルのビルド
続いて、圧縮ファイルを解凍し、Jetty上で実行するためのWARファイルを作成します。
$ unzip $HOME/banana/v1.5.0.zip -d $HOME/banana $ cd $HOME/banana/banana-1.5.0 $ ant -Dbuild.number=1.5.0 $ cd $HOME
3.3 Bananaのインストール
作成できたWARファイルとJettyのコンテキスト設定を行うファイル、Bananaの設定をSolrに保存できるようにするためのSolrコレクションを、先ほどインストールしたSolrへコピーします。
$ cp $HOME/banana/banana-1.5.0/build/banana-1.5.0.war $SOLR_HOME/visualization/webapps/banana.war $ cp $HOME/banana/banana-1.5.0/jetty-contexts/banana-context.xml $SOLR_HOME/visualization/contexts/. $ cp -r $HOME/banana/banana-1.5.0/resources/banana-int-solr-4.5/banana-int $SOLR_HOME/visualization/solr/.
以上で、Bananaのインストールと設定は完了です。