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);
}