mapreduce之combiner函式
阿新 • • 發佈:2018-12-30
一個例子說明combiner的作用:hadoop允許使用者針對map任務輸出指定一個combiner,combiner函式的輸出作為reduce的輸入
(1)假設第一個map的輸出如下:
(1950,0)//1950表示年份,0表示地方A的最高溫度
(1950,20)
(1950,10)
(2)假設第二個map的輸出如下:
(1950,25)//1950表示年份,0表示地方A的最高溫度
(1950,15)
(3)reduce函式被呼叫,輸入如下:
(1950,[0,20,10,25,15])
(4)如果是使用combiner函式找出每個map任務輸出結果中的最高溫度。如此一來,reduce的資料如下:
(1950,[20,25])
在job中加入combiner函式:
job.setConbinerClass(MaxTemperarureReducer.class);//在job中加入combiner函式
注:combiner的優點是可以減少map傳給reduce的資料量
下面以wordcount為例:
public class WordcountCombiner extends Reducer<Text, IntWritable, Text, IntWritable>{
@Override
protected void reduce(Text key, Iterable<IntWritable> values, Context context) throws IOException, InterruptedException {
int count=0;
for(IntWritable v: values){
count += v.get();
}
context.write(key, new IntWritable(count));
}
}
增加這樣一個combiner如果遇到重複率很高的資料就可以用類似字典樹的方法壓縮資料解決了,如果有10000個z,原來需要傳送10000次<z,1>的資料給reduce,現在只需要發一個<z,10000>即可,大大減小了網路傳輸的資料量,但是使用combiner一定不能影響最終結果才行。