天天看點

mr-wordcountmapreduce

3部分,driver、map、reduce

一個block配置設定一個map程序,入參是一行

一個reduce隻會處理一個key,入參是

<key,Iterator<value>>

,也就是說,有多少個key,就會有多少個reduce程序

分布式計算引擎将使用者送出的應用轉化為多個較小的task,通過資源管理和任務排程工具實作并行執行。

mapper(map任務)将輸入的分塊資料進行map()處理,将輸出結果寫入緩沖區,對buffer中的資料進行分區、排序、聚合等操作,最後将資料輸出到本地磁盤上的不同分區。然後發送給reducer。

reducer從mapper的對應分區中拉取資料到本地buffer(如果不夠會排序後寫入磁盤),然後經過歸并、排序等階段将資料寫入hdfs。

map

//key是google的曆史遺留問題,隻有在建立搜尋引擎索引的時候才用得到
//value就是一行,預設的InputFormat是按行讀
//context是個分布式的環境,用來傳輸
//Text不要每次都建立,使用一個共享的
Text text = new Text();
final Intwritable one = new Intwritable(1);
map(key,value,context){
	array = value.split()
	array.foreach(context.write(text.set(word),one))
}
           

reduce

/**
 *	一個key對應一個reducer,自然也對應一個集合values
 */
private IntWritable result = new IntWritable();
reduce(key,Iterator<value> values,context){
	 //暫存每個key組中計算總和
     int sum = 0;
     //加強型for,依次擷取疊代器中的每個元素值,即為一個一個的詞頻數值
     for (IntWritable val : values) {
           //将key組中的每個詞頻數值sum到一起
           sum += val.get();
     }
     //将該key組sum完成的值放到result IntWritable中,使可以序列化輸出
     result.set(sum);
     //将計算結果逐條輸出
     context.write(key, result);
}
           

繼續閱讀