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等で可視化する際に役に立ちそうだ。