什麼是shuffle流程?
mapreduce確保每個reducer的輸入都是按鍵排序的。系統執行排序,將map輸出作為輸入傳給reducer的過程稱為shuffle.
簡單來說就是:從map輸出開始,到reduce輸入之前這個階段。
如下圖所示:
每個map任務的結果輸出到緩衝區中(預設大小為100m的環形緩衝區)
備註:每個map任務都有乙個環形記憶體緩衝區用於儲存任務輸出。在預設情況下,緩衝區的大小為100mb,
這個值可以通過mapreduce.task.io.sort.mb屬性來調整。一旦緩衝內容值達到閥值(mapreduce.map.sort.spill.percent,預設為0.80,或80%)
乙個後台執行緒便開始把內容從記憶體溢寫(spill)到磁碟。如下所訴spill階段
(在寫入磁碟之前,執行緒會在記憶體進行分割槽;在每個分割槽中進行排序。如果配置了combiner函式,還會將有相同分割槽號的key的資料進行排序,使得map輸出更加緊湊)
當緩衝區記憶體中的資料達到閥值的時候,就會將資料溢寫到本地磁碟(
溢寫執行緒啟動,鎖定這百分之80的記憶體,執行溢寫過程。
map任務還可以往這剩下的20m記憶體中寫),產生溢寫檔案。但如果在此期間緩衝區被填滿(剩下的百分之20),map會被阻塞直到寫磁碟過程完成。將將緩衝區的內容寫道mapreduce.cluster.local.dir屬性指定的目錄中。
在map任務寫完最後乙個輸出記錄後,會有幾個溢位檔案被合併成乙個已分割槽且已排序的輸出檔案。
將同一分割槽的資料聚集,把所有溢位寫的臨時檔案進行一次合併
以確保乙個maptask最終只產生乙個中間資料檔案。
>配置屬性mapreduce.task.io.sort.factor控制一次最多能合併多少個檔案,預設值是10.
reduce端的執行緒通過http協議複製當前reducetask要處理的分割槽資料,先複製到記憶體中的快取中,
根據快取大小來決定是否產生檔案,如果map輸出小,會被複製到reduce任務jvm記憶體,
當記憶體的快取區達到一定的閥值時,就會將資料寫到磁碟上
reduce端會合併多個檔案,在對資料進行合併的同時,會進行排序操作,
由於map階段已經對資料進行了布局的排序,reduce任務只需保證複製的整體性和有效性即可
最後一次合併不產生檔案,直接在記憶體中輸入reduce
Shuffle機制流程原理
mapreduce確保每個reducer的輸入都是按鍵排序的。系統執行排序的過程 即將map輸出作為輸入傳給reducer 稱為shuffle。shuffle階段是從map方法輸出資料以後開始到reduce方法輸入資料之前結束。分割槽的數量 reducetask數量 結果檔案的數量 首先是由map方...
MapReduce流程及Shuffle機制
mapreduce流程 job的submit 方法建立乙個jobsubmmiter例項,呼叫submitjobinternal 方法。shuffle mapreduce確保每個reducer的輸入都是按鍵排序。系統執行排序 將map輸出作為輸入傳給reducer的過程稱為shuffle。maptas...
簡單搞定spark的shuffle流程
1 在spark中,什麼情況下,會發生shuffle?reducebykey groupbykey sortbykey countbykey join cogroup等操作。2 預設的shuffle操作的原理剖析 3 優化後的shuffle操作的原理剖析 4 shuffle相關原始碼分析 普通的sh...