2014年6月9日 星期一

[elasticsearch]elasticsearch-hadoop using mapreduce with elasticsearch




說到對於大資料的操作,不少人會直接想到 hadoop 裡面的MapReduce。
由於,elasticsearch是個搜索引擎。
常常有些人會把他們兩個混用,但是,必須注意的就在於如果在於單純的query,千萬不要在MapReduce裡面有自己做分段query。因為這樣是種疊床架屋的操作。

一個 component 是否可以 scalability,可以從他的架構上可不可以把平行處理或是把大的task拆分成多個比較小的task並且同時處理。

Mapreduce  splits and  Elasticsearch shard

這樣的概念同時蘊含在 hadoop 與 elasticsearch裡面。MapReduce 在運行時,會把input 的file split 成若干等份。在 Mapreduce  中,一個 input split 就代表著一個 mapper的運行。換言之, input splits 就表示就是把一份data分別給分塊給多個mapper來處理。

elasticsearch的shard (nums of part in which a index is divided into) 拆分也蘊含著這樣的概念。
每個 index 包含若干個 shards ,每個 shard 在 elasticsearch的 node上 實際儲存的是一個實際的 lucene index。
可閱讀之前文章了解 elasticsearch 稱為 分散式搜尋引擎的設計。

簡而言之,多個input splits就表示,同時有多個mapper會同時對來源的不同part做讀取的操作。

elasticsearch 官方所提供的 elasticsearch-hadoop lib 剛好就是針對 elasticsearch 與 mapreduce的特點去設計的。

elasticsearch/elasticsearch-hadoop
https://github.com/elasticsearch/elasticsearch-hadoop

elasticsearch-hadoop/mr/src/main/java/org/elasticsearch/hadoop/mr/EsInputFormat.java at master · elasticsearch/elasticsearch-hadoop
https://github.com/elasticsearch/elasticsearch-hadoop/blob/master/mr/src/main/java/org/elasticsearch/hadoop/mr/EsInputFormat.java
由上,可以看到 getsplits 與 shardinputsplit 的實作
    protected static class ShardInputSplit extends InputSplit implements org.apache.hadoop.mapred.InputSplit {
 
elasticsearch-hadoop 的 InputSplit 是採取有多少 shard 來決定 mapper的數量的。

reading from elasticsearch  使用 mapreduce query elasticsearch 

從 elasticsearch query資料時,預設 elasticsearch 每個index 的 shard數是5。所以,Hadoop 的 mapreduce 會起五個 map 到各個shard做操作。

官方的 lib 已經提供了一條 居於 elasticsearch 與 hadoop mapredcue performace 最高效設計。

writing to elasticsearch 使用 mapreduce 寫資料到 elasticsearch 

使用 elasticsearch-hadoop 時,會根據shard數起mapper 並把資料分發到不同map (shard) 平行的 寫入 elasticsearch。


Ref:

沒有留言:

張貼留言