更新時間:2021-07-20 來源:黑馬程序員 瀏覽量:
map階段處理的數(shù)據(jù)如何傳遞給reduce階段,是MapReduce框架中關(guān)鍵的一個流程,這個流程就叫shuffle。
shuffle: 洗牌、發(fā)牌--(核心機制:數(shù)據(jù)分區(qū),排序,合并)。
shuffle是Mapreduce的核心,它分布在Mapreduce的map階段和reduce階段。一般把從Map產(chǎn)生輸出開始到Reduce取得數(shù)據(jù)作為輸入之前的過程稱作shuffle。
1.Collect階段:將MapTask的結(jié)果輸出到默認大小為100M的環(huán)形緩沖區(qū),保存的是key/value,Partition分區(qū)信息等。
2.Spill階段:當內(nèi)存中的數(shù)據(jù)量達到一定的閥值的時候,就會將數(shù)據(jù)寫入本地磁盤,在將數(shù)據(jù)寫入磁盤之前需要對數(shù)據(jù)進行一次排序的操作,如果配置了combiner,還會將有相同分區(qū)號和key的數(shù)據(jù)進行排序。
3.Merge階段:把所有溢出的臨時文件進行一次合并操作,以確保一個MapTask終只產(chǎn)生一個中間數(shù)據(jù)文件。
4.Copy階段: ReduceTask啟動Fetcher線程到已經(jīng)完成MapTask的節(jié)點上復(fù)制一份屬于自己的數(shù)據(jù),這些數(shù)據(jù)默認會保存在內(nèi)存的緩沖區(qū)中,當內(nèi)存的緩沖區(qū)達到一定的閥值的時候,就會將數(shù)據(jù)寫到磁盤之上。
5.0Merge階段:在ReduceTask遠程復(fù)制數(shù)據(jù)的同時,會在后臺開啟兩個線程對內(nèi)存到本地的數(shù)據(jù)文件進行合并操作。
6.Sort階段:在對數(shù)據(jù)進行合并的同時,會進行排序操作,由于MapTask階段已經(jīng)對數(shù)據(jù)進行了局部的排序,ReduceTask只需保證Copy的數(shù)據(jù)的 終整體有效性即可。
Shuffle中的緩沖區(qū)大小會影響到mapreduce程序的執(zhí)行效率,原則上說,緩沖區(qū)越大,磁盤io的次數(shù)越少,執(zhí)行速度就越快。緩沖區(qū)的大小可以通過參數(shù)調(diào)整, 參數(shù):io.sort.mb 默認100M