MapReduce运行机制-Reduce阶段
ReduceTask 工作機制和 ReduceTask 并行度
?Reduce 大致分為 copy、sort、reduce 三個階段,重點在前兩個階段。copy 階段包含一個 eventFetcher 來獲取已完成的 map 列表,由 Fetcher 線程去 copy 數據,在此過程中會啟動兩個 merge 線程,分別為 inMemoryMerger 和 onDiskMerger,分別將內存中的數據 merge 到磁盤和將磁盤中的數據進行 merge。待數據 copy 完成之后,copy 階段就完成了,開始進行 sort 階段,sort 階段主要是執行 finalMerge 操作,純粹的 sort 階段,完成之后就是 reduce 階段,調用用戶定義的 reduce 函數進行處理
詳細步驟
1. Copy階段,簡單地拉取數據。Reduce進程啟動一些數據copy線程(Fetcher),通過HTTP方式請求maptask獲取屬于自己的文件。
2. Merge階段。這里的merge如map端的merge動作,只是數組中存放的是不同map端copy來的數值。Copy過來的數據會先放入內存緩沖區中,這里的緩沖區大小要比map端的更為靈活。merge有三種形式:內存到內存;內存到磁盤;磁盤到磁盤。默認情
況下第一種形式不啟用。當內存中的數據量到達一定閾值,就啟動內存到磁盤的merge。與map 端類似,這也是溢寫的過程,這個過程中如果你設置有Combiner,也是會啟用的,然后在磁盤中生成了眾多的溢寫文件。第二種merge方式一直在運行,直到沒有map端的數據時才結束,然后啟動第三種磁盤到磁盤的merge方式生成最終的文件。
3. 合并排序。把分散的數據合并成一個大的數據后,還會再對合并后的數據排序。
4. 對排序后的鍵值對調用reduce方法,鍵相等的鍵值對調用一次reduce方法,每次調用會產生零個或者多個鍵值對,最后把這些輸出的鍵值對寫入到HDFS文件中。
Shuffle 過程
map 階段處理的數據如何傳遞給 reduce 階段,是 MapReduce 框架中最關鍵的一個流程,這個流程就叫 shuffle
shuffle: 洗牌、發牌 ——(核心機制:數據分區,排序,分組,規約,合并等過程)
shuffle 是 Mapreduce 的核心,它分布在 Mapreduce 的 map 階段和 reduce 階段。一般把從 Map 產生輸出開始到 Reduce 取得數據作為輸入之前的過程稱作 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 的數據的最終整體有效性即可。Shuffle 中的緩沖區大小會影響到 mapreduce 程序的執行效率,原則上說,緩沖區越
大,磁盤io的次數越少,執行速度就越快
緩沖區的大小可以通過參數調整, 參數:mapreduce.task.io.sort.mb 默認100M
總結
以上是生活随笔為你收集整理的MapReduce运行机制-Reduce阶段的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: MapReduce运行机制-Map阶段
- 下一篇: MapReduce-Reduce端joi