Elasticsearch for Apache Hadoop の Multi-index Writes を試す
Elasticsearch for Apache Hadoop 1.3 M3から追加されたMulti-index Writesという機能をHiveで試してみた。
たとえば定期的にMapReduceを実行して、1日毎にindexまたはtypeを分けたいという要件があるような場合など、データの内容によって、動的に別のindexやtypeに書き込みたい場合に便利な機能だ。
http://www.elasticsearch.org/blog/elasticsearch-apache-hadoop-1-3-m3/
元データ(テーブル名「source」)
rec_dateカラムの値を見て動的にtypeを振り分けるようにする。
id,item.price.rec_date 1,beef,600,2014-05-13 2,chicken,430,2014-05-13 3,pork,315,2014-05-15
Elasticsearch用外部テーブルの作成
STORED BY句でElasticsearch用のストレージハンドラを指定し、
es.resourceオプションで、{}に参照させたい値を含むカラム名を指定する。
CREATE EXTERNAL TABLE tbl1 ( id STRING, item STRING, price STRING, rec_date STRING ) STORED BY 'org.elasticsearch.hadoop.hive.EsStorageHandler' TBLPROPERTIES('es.resource' = 'toire/ofuro-{rec_date}');
Elaticsearchへのデータ投入
あとは通常通り、元データを参照して、Elasticsearch用テーブルにINSERTすればOK。
INSERT OVERWRITE TABLE tbl1 SELECT s.id, s.item, s.price, s.rec_date FROM source s;
これで投入されたデータはrec_dateをもとに、それぞれ別々のtype(ofuro-2014-05-13, ofuro-2014-05-14, ofuro-2014-05-15)に保存される。
バッチ等でデータを定期的に集計しつつ、自動的に別々の器に入れて、Kibana等で可視化する際に役に立ちそうだ。