使用Hadoop操作Elasticsearch的方法,關鍵是指定
InputFormatClass : EsInputFormat.class
OutputFormatClass: EsOutputFormat.class,這個好像是ES官方提供的整合包。
網上查了相關資料貌似挺少的。
直接用一個例子來看如何使用了,Java實現。
例子:通過Map/Reduce將yy/test中sample值為2的資料移到javaman/yy中
方法/步驟
在Elasticsearch中建一些測試資料吧
yy/test中總共14條資料,sample=2的有7條資料
匯入jar包
設定ES節點資訊:
getConf().set(ConfigurationOptions.ES_NODES, Constant.ES_NODES);
指定index和type:
getConf().set(ConfigurationOptions.ES_RESOURCE, args[0]);
如果對一個index操作這裡直接這樣寫就可以了,如果讀寫不同index就需要分別指定了:
getConf().set("es.resource.read", args[0]);
getConf().set("es.resource.write", args[1]);
查詢條件:
getConf().set(ConfigurationOptions.ES_QUERY, "?q=sample:2");
寫Map/Reduece
EsOutputFormat沒有使用這裡的key作為id,所以這裡的key是沒有用的,隨便寫啥都行。。。
直接執行檢視下結果
成功將7條記錄複製到了javaman中了。
這時候id是ES自動生成的,如何我們自己指定id呢?
使用指定屬性的值來作為id,我這裡測試就用timestamp吧。使用中用你的值唯一的可以作為主鍵的屬性都可以的。
getConf().set("ConfigurationOptions.ES_MAPPING_ID", "timestamp");
也可以在reduce中在MapWritable中新增唯一屬性也是可以的。
刪除javaman的index,重新執行看下結果吧
新的index中的id和timestamp值一致。
OK,這裡主要時對ES的讀寫,後面把操作MongoDB、Mysql。。也簡單整理下,也方便時間久了之後檢視。