MapReduce執行流程之shuffle機制

  • 介紹

shuffle機制是MapReduce執行過程中非常重要的一個流程。它處於Map階段和Reduce階段之間,它的具體處理步驟分佈MapTask階段和ReduceTask階段。按照shuffle的機制,他可以將map階段處理完成的數據重新排列組合(內部其實是在分區、排序、預聚合),最後將數據交給reduceTask處理。Shuffle中的緩衝區大小會影響到MapReduce程序的執行效率,原則上說,緩衝區越大,磁盤io的次數越少,執行速度就越快。

  • Map階段的shuffle

 

  1. 首先讀取來的數據會經過map的方法處理,之後通過context.write寫出到環形緩衝區中,在此期間會調用partition方法對數據進行分區,系統默認分區的方式是HashPartition,是根據key的hashCode對reduceTask個數取模得到,用戶沒辦法控制數據去往哪個分區;如果用戶自定義了分區,就調用用戶自定義的分區機制。
  2. 環形緩衝區默認爲100M,當數據達到預先設置的闕值(mapreduce.map.io.sort.spill.percent,默認0.80)時就會溢寫本地磁盤(溢出寫過程按輪詢方式將緩衝區中的內容寫到指定的目錄中),在此期間數據會進行分區內排序,默認排序是按照字典序進行快數排序(先按照分區編號Partition進行排序,然後按照key進行排序);如果用戶自定義了排序規則,就按照用戶自定義的規則進行排序。環形緩衝區處理完的一次數據就會將數據溢寫到本地臨時文件中(這時處理完的數據以分區爲單位聚集在一起,且同一分區內所有數據按照key有序)。
  3. 在此期間用戶如何定義了Combiner(是一個可選流程),系統會將MapTask每一次的輸出結果進行局部彙總,也就是預聚合,這樣做可以減少和Reduce端傳輸時的IO,可以提高程序執行效率。
  4. 等到整個mapTask將文件數據全部處理完成,本地臨時文件中的所有文件會進行一個大的歸併排序,將數據按照分區進行合併,將分區相同的數據合併在一起並且進行區內排序。

Reduce階段的shuffle 

 

  1. ReduceTask根據自己的分區號,去各個MapTask上拉取相應的結果分區的數據。ReduceTask會拿到來自不同MapTask上的同一個分區的數據。
  2. 拿到全部的數據之後,會對這些文件進行歸併排序,合成一個大文件。文件中的數據是同一個分區且有序的。
  3. 合併成大文件後,Shuffle的過程也就結束了,後面進入ReduceTask的邏輯運算過程。 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章