大數據學習之MapReduce核心(Shuffle洗牌)12
先來個原理圖壓壓驚:
溫馨提示:如果看不清這個圖,可以下載下來,在自己電腦上可以放大。
或者直接放大瀏覽器。快捷鍵Ctrl+鼠標滑輪上即可放大。想恢復原來瀏覽器的默認大小,快鍵鍵:Ctrl+數字0
一:概述shuffle
Shuffle是mapreduce的核心,鏈接map與reduce的中間過程。
Mapp負責過濾分發,而reduce則是歸並整理,從mapp輸出到reduce的輸入的這個過程稱為shuffle過程。
二:map端的shuffle
1.map結果的輸出
map的處理結果首先存放在一個環形的緩沖區。
這個緩沖區的內存是100M,是map存放結果的地方。如果數據量較大,超過了一定的量(默認80M),將會發生溢寫過程。
在mapred-site.xml中設置內存的大小
<property>
<name>mapreduce.task.io.sort.mb</name>
<value>100</value>
</property>
在mapred-site.xml中設置內存溢寫的閾值
<property>
<name>mapreduce.task.io.sort.spill.percent</name>
<value>0.8</value>
</property>
2.溢寫過程
溢寫是系統在後臺單獨開一個線程去操辦。
溢寫過程包括:分區partion,排序sort,溢寫spill to disk,合並merge。
3.分區
分區分的是80%的內存。
因為reduce可能有不同的任務,所以會對80M的內存進行分區,將map的輸出結果放入的對應的reduce分區中。
4.排序
默認是按照key排序。
當分區完成之後,對每一個分區的數據進行排序。
5.溢寫
排序之後,將內存的數據寫入硬盤。留出內存方便map的新的輸出結果。
6.合並
如果是第一次寫入硬盤則不需要考慮合並問題,但是在大數據的情況下,前面已經存在大量的spill文件的時候,這時候需要將它們進行合並。
將各個分區合並之後,對每一個分區的數據再進行一次排序
使用歸並的方式進行合並,歸並算法。
實現compara,進行比較。
形成一個文件。
三:reduce端的shuffle
1.步驟
對於reduce端的shuffle,大致分為復制,合並。
2.復制
當reduce開啟任務後,不斷的在各個節點復制需要的數據。
3.合並(內含排序)
復制數據的時候,把可以存放進內存的就把數據存放在內存中,當達到一定的時候,啟動merge,將數據寫進硬盤。
如果map數據大於內存需要存放的限制,直接寫入硬盤,當達到一定的數量後將其合並為一個文件。
這時候,reduce開啟任務需要的數據在內存中和在硬盤中,最終形成一個全局文件。
4.分組
《hadoop,1》
《hadoop,1》
《yarn,1》
《hadoop,1》
《hdfs,1》
《yarn,1》
將相同的key放在一起,使用comparable完成比較。
結果為:
《hadoop,list(1,1,1)》
《yarn,list(1,1)》
《hdfs,list(1)》
再來個簡易版的洗牌圖吧!!!以便理解
大數據學習之MapReduce核心(Shuffle洗牌)12