Hadoop?

Tags: 資料, 例子,

使用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條資料

Hadoop 讀寫 Elasticsearch

Hadoop 讀寫 Elasticsearch

匯入jar包

org.elasticsearch

elasticsearch-hadoop-mr

2.1.2

Hadoop 讀寫 Elasticsearch

設定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");

Hadoop 讀寫 Elasticsearch

Hadoop 讀寫 Elasticsearch

寫Map/Reduece

EsOutputFormat沒有使用這裡的key作為id,所以這裡的key是沒有用的,隨便寫啥都行。。。

Hadoop 讀寫 Elasticsearch

直接執行檢視下結果

成功將7條記錄複製到了javaman中了。

這時候id是ES自動生成的,如何我們自己指定id呢?

Hadoop 讀寫 Elasticsearch

使用指定屬性的值來作為id,我這裡測試就用timestamp吧。使用中用你的值唯一的可以作為主鍵的屬性都可以的。

getConf().set("ConfigurationOptions.ES_MAPPING_ID", "timestamp");

也可以在reduce中在MapWritable中新增唯一屬性也是可以的。

Hadoop 讀寫 Elasticsearch

刪除javaman的index,重新執行看下結果吧

新的index中的id和timestamp值一致。

OK,這裡主要時對ES的讀寫,後面把操作MongoDB、Mysql。。也簡單整理下,也方便時間久了之後檢視。

Hadoop 讀寫 Elasticsearch

Hadoop 讀寫 Elasticsearch

相關問題答案