1.什么是Shuffle機制
1.1)在Hadoop中數據從Map階段傳遞給Reduce階段的過程就叫Shuffle,Shuffle機制是整個MapReduce框架中最核心的部分。
1.2)Shuffle翻譯成中文的意思為:洗牌、發牌(核心機制:數據分區、排序、緩存)
2.Shuffle的作用范圍
一般把數據從Map階段輸出到Reduce階段的過程叫Shuffle,所以Shuffle的作用范圍是Map階段數據輸出到Reduce階段數據輸入這一整個中間過程!
3.Shuffle圖解

上圖是官方對Shuffle過程的描述,通過圖片我們可以大致的了解到Shuffle的工作流程。Shuffle並不是Hadoop的一個組件,只是map階段產生數據輸出到reduce階段取得數據作為輸入之前的一個過程。
4.Shuffle的執行階段流程
1).Collect階段:將MapTask的結果輸出到默認大小為100M的環形緩沖區,保存的是key/value序列化數據,Partition分區信息等。
2).Spill 階段:當內存中的數據量達到一定的閥值的時候,就會將數據寫入本地磁盤,在將數據寫入磁盤之前需要對數據進行一次排序的操作,如果配置了combiner,還會將有相同分區號和key的數據進行排序。
3).Merge 階段:把所有溢出的臨時文件進行一次合並操作,以確保一個MapTask最終只產生一個中間數據文件。
4).Copy階段: ReduceTask啟動Fetcher線程到已經完成MapTask的節點上復制一份屬於自己的數據,這些數據默認會保存在內存的緩沖區中,當內存的緩沖區達到一定的閥值的時候,就會將數據寫到磁盤之上。
5).Merge階段:在ReduceTask遠程復制數據的同時,會在后台開啟兩個線程(一個是內存到磁盤的合並,一個是磁盤到磁盤的合並)對內存到本地的數據文件進行合並操作。
6).Sort階段:在對數據進行合並的同時,會進行排序操作,由於MapTask 階段已經對數據進行了局部的排序,ReduceTask只需保證Copy的數據的最終整體有效性即可
5.總結
Shuffle的大致流程為:Maptask會不斷收集我們的map()方法輸出的kv對,放到內存緩沖區中,當緩沖區達到飽和的時候(默認占比為0.8)就會溢出到磁盤中,如果map的輸出結果很多,則會有多個溢出文件,多個溢出文件會被合並成一個大的溢出文件,在文件溢出、合並的過程中,都要調用partitoner進行分組和針對key進行排序(默認是按照Key的hash值對Partitoner個數取模),之后reducetask根據自己的分區號,去各個maptask機器上取相應的結果分區數據,reducetask會將這些文件再進行合並(歸並排序)。
合並成大文件后,shuffle的過程也就結束了,后面進入reducetask的邏輯運算過程(從文件中取出每一個鍵值對的Group,調用UDF函數(用戶自定義的方法))
注意
Shuffle 中的緩沖區大小會影響到 mapreduce 程序的執行效率,原則上說,緩沖區越大,磁盤io的次數越少,執行速度就越快,正是因為Shuffle的過程中要不斷的將文件從磁盤寫入到內存,再從內存寫入到磁盤,從而導致了Hadoop中MapReduce執行效率相對於Storm等一些實時計算來說比較低下的原因。
Shuffle的緩沖區的大小可以通過參數調整, 參數:io.sort.mb 默認100M
關於Shuffle的概念就介紹到這里,希望對初學Shuffle的人有一定的幫助和了解!
