1. 程式人生 > >MapReduce工作機制詳解(MapTask和ReduceTask)

MapReduce工作機制詳解(MapTask和ReduceTask)

MapTask:

1.maptask0負責切片0 ,maptask1負責切片1,maptask2負責切片2。

2.maptask0通過一個元件TextinputFormat讀切片0,這個元件封裝一個LineRecordReader,裡面有next方法,每調一次方法從切片0裡讀一行,給maptask返回k1:行起始offset和value1:行內容。

3.呼叫mapper裡的map(k1,v1,context)方法,再返回context.write(k2,v2)。

4.mapTask收到k2 v2,再呼叫mapTask裡的工具類,呼叫outputColletor.collect(),序列化,變成二進位制,放到一個環形的緩衝區。

5.不斷向緩衝區放輸出的資料,環形緩衝區預設是100M,當放入容量差不多達到80%,把資料溢位呼叫元件spiler.spill(),在過程中先分割槽:k.hashcode%reducetasts排序:同一個區內按key排序,得到分割槽,根據這個分割槽檔案寫到磁盤裡去。(演算法是快速排序演算法)

6.當緩衝結束,讀取切片完成,會把溢位檔案合併,對區域性資料通過歸併排序(外部排序演算法)。


ReduceTask

1.reduceTask0從多個mapTask拿到的partiton0的資料合併放在本地磁碟。

2.呼叫XXXReducer類裡的reduce(Text key,迭代器 values,context),輸出資料context.write(k3,v3)

3.呼叫TextOtputFormat裡的RecordWriter.write(k3,v3)

4.然後在指定的HDFS的目錄寫檔案。