Shuffle描述着數據從Map Task輸出到Reduce Task輸入的這段過程。
線程
Map端:排序
一、每一個Map有一個環形內存緩衝區,用於存儲任務的輸出,默認大小100MB(io.sort.mb屬性),一旦達到閥值內存
0.8(io.sort.spill.percent),一個後臺線程把內容寫到(spill)磁盤的指定目錄(mapred.local.dir)下的新建的一個
it
溢出文件。io
二、在寫入磁盤前,要Partitioner,Sort,若是有Combiner(聚合),Combiner排序後在寫入數據。
後臺
三、等最後把記錄寫完,合併所有溢出寫文件爲一個分區且排序的文件。
map
Reduce端:
並行
一、Reduce經過Http方式獲得輸出的文件的分區。
im
二、TaskTracker爲分區文件運行Reduce任務。複製階段把Map輸出複製到Reduce的內存或磁盤。一個Map任 務完成,Reduce就開始複製輸出。
數據
三、排序階段合併Map輸出,而後走Reduce階段。
注意:在有些狀況下,也有可能沒有任何的Reduce,當前數據處理能夠徹底並行時,即無需混洗(shuffle),可能
會出現無Reduce任務的狀況,在這種狀況下,惟一的非本地節點數據傳輸是Map任務將結果寫入HDFS.
Name:Xr
Date:2014-03-04 21:55