本章內容咱們學習一下 MapReduce 中的 Shuffle 過程,Shuffle 發生在 map 輸出到 reduce 輸入的過程,它的中文解釋是 「洗牌」,顧名思義該過程涉及數據的從新分配,主要分爲兩部分:1. map 任務輸出的數據分組、排序,寫入本地磁盤 2. reduce 任務拉取排序。因爲該過程涉及排序、磁盤IO、以及網絡IO 等消耗資源和 CPU 比較大的操做,所以該過程向來是「兵家必爭」之地,即你們會重點優化的一個地方,所以也是大數據面試中常常會被重點考察的地方。本文力求通俗、簡單地將 Shuffle 過程描述清楚。面試
包含 Shuffle 過程的 MapReduce 任務處理流程以下圖,圖片來自《Hadoop權威指南(第四版)》apache
接下來,分別介紹 Shuffle 所涉及的主要操做。網絡
map 端輸出時,先將數據寫入內存中的環形緩衝區,默認大小爲 100M,能夠經過 mapreduce.task.io.sort.mb 來設置。map 端輸出過程以下:多線程
以上即是 map 任務輸出過程的主要操做,輸出到磁盤後,reducer 會經過 http 服務拉取輸出文件中屬於本身分區的數據。併發
reduce 端在 Shuffle 階段主要涉及複製和排序兩個過程。 reduce 端拉取 map 輸出數據的過程是複製階段,對應上圖中的 fetch。一個 reduce 任務須要從多個 map 輸出複製。所以只要有 map 任務完成,reduce 任務就能夠進行復制。複製的過程能夠是多線程併發進行,併發的線程個數由 mapreduce.reduce.shuffle.parallelcopies 設置,默認是 5 。app
以上即是 reduce 任務前的複製、排序階段。至此,整個 Shuffle 過程就介紹完畢。函數
咱們在上面介紹 Shuffle 過程時已經提到了一些參數,這裏統一整理並說明一下oop
參數名 | 默認值 | 說明 |
mapreduce.task.io.sort.mb | 100 | map 輸出是所使用的內存緩衝區大小,單位:MB |
mapreduce.map.sort.spill.percent | 0.80 | map 輸出溢寫到磁盤的內存閾值 |
mapreduce.task.io.sort.factor | 10 | 排序文件是一次能夠合併的流數 |
mapreduce.map.output.compress | false | map 輸出是否壓縮 |
mapreduce.map.output.compress.codec | org.apache.hadoop.io.compress.DefaultCodec | map 輸出壓縮的編解碼器 |
咱們但願在 map 輸出階段可以提供更多的內存空間,以提高性能。所以 map 函數應該儘可能少佔用內存,以便留出內存用於輸出。咱們也能夠評估 map 輸出,經過增大 mapreduce.task.io.sort.mb 值來減小溢寫的文件數。性能
參數名 | 默認值學習 |
說明 |
mapreduce.reduce.shuffle.parallelcopies | 5 | 併發複製的線程數 |
mapreduce.task.io.sort.factor | 10 | 同 map 端 |
mapreduce.reduce.shuffle.input.buffer.percent | 0.70 | Shuffle 的複製階段,用來存放 map 輸出緩衝區佔reduce 堆內存的百分比 |
mapreduce.reduce.shuffle.merge.percent | 0.66 | map 輸出緩衝區的閾值,超過該比例將進行合併和溢寫磁盤 |
mapreduce.reduce.merge.inmem.threshold | 1000 | 閾值,當累積的 map 輸出文件數超過該值,進行合併和溢寫磁盤,0或者負值意味着改參數無效,合併和溢寫只由 mapreduce.reduce.shuffle.merge.percent 控制 |
mapreduce.reduce.input.buffer.percent | 0.0 | 在 reduce 過程(開始運行 reduce 函數時),內存中保存 map 輸出的空間站整個堆空間的比例。 默認狀況下,reduce 任務開始前全部的 map 輸出合併到磁盤,以便爲 reducer 提供儘量多的內存。 若是 reducer 須要的內存較少,能夠增長此值以最小化磁盤訪問次數 |
在 reduce 端,進行 reduce 函數前,若是中間數據所有駐留內存能夠得到最佳性能,默認狀況是不能實現的。若是 reduce 函數內存需求不大,把 mapreduce.reduce.input.buffer.percent 參數設置大一些能夠提高性能。
今天這章,咱們詳細介紹了 Shuffle 過程,關注 Shuffle 過程的性能對整個 MR 做業的性能調優相當重要。通過這章的介紹,咱們可以掌握 Shuffle 過程的關鍵技術點,雖然還不算深刻。同時,咱們介紹了常見的參數以及調優方法,但願可以在實際應用中不斷的嘗試、總結,寫出性能最佳的任務。