在這裡插入圖片描述

Maprudece的Shuffle機制

1.shuffle:map的輸出作為reduce的輸入的中間的過程
2.shuffle的階段
1)由map()方法將key/vaule寫到環形緩衝區當中
2)環形緩衝區預設為100MB,若達到閾值(80%)就會發生溢寫,產生臨時檔案(將80MB的檔案溢寫,並且不影響向緩衝區寫入資料的過程,這個過程是啟動了單獨的一個執行緒來做,如果map輸出的資料量大,溢寫可能會發生多次,最後,環形緩衝區裡的資料會合併成一個檔案進行溢寫的操作)
3)溢寫的檔案經過預設的分割槽(partitioner)和排序(sort)
4)Combiner:區內合併,這裡的合併是可選的,是對程式的一個優化,減少了磁碟IO的消耗,我們需要確保combine的輸入和輸出是一樣的, 另外還要考慮本地的reduce對最終的結果是否有影響,比如wordcount,他在本地做累加對最終的結果是沒有影響,可以使用combine; 但是計算平均數就不行了,主要這個過程有資訊的丟失。
5)merge:歸併,區與區合併,將相同分割槽的合併。
6)reducetask先通過記憶體緩衝的方式先copy部分屬於自己的資料,當超過閾值時,溢位到
磁碟.
7)不管在記憶體還是磁碟,都要再一次的進行歸併排序
8)按照相同的key進行分組
9)傳給reduce()方法

分割槽排序Combiner分組都可以根據自身業務需求進行自定義,reducetaske的數量由分割槽決定,預設的分割槽數量為1,可以通過自定義來修改數量,在job裡設定就可以。