本章來簡單介紹下 Hadoop MapReduce 中的 Combiner。Combiner 是爲了聚合數據而出現的,那爲何要聚合數據呢?由於咱們知道 Shuffle 過程是消耗網絡IO 和 磁盤IO 比較大的操做,若是咱們能減小 Shuffle 過程的數據量,那就能夠提高整個 MR 做業的性能。我在《大數據技術 - MapReduce的Shuffle及調優》 一文中寫到 Shuffle 中會有兩次調用 Combiner 的過程,有興趣的朋友能夠再翻回去看看。接下來咱們仍是以 WordCount 爲例,簡單介紹下 Combiner 的做用以及什麼時候能夠設置 Combiner。網絡
假設有 2 個輸入文件,每一個文件只有一行數據,所以 map 階段啓動的 map 任務數爲 2,reduce 任務的數量使用默認值 1 便可。文件內容以下:app
#第一個文件內容
hello hello
#第二個文件的內容
world world
本例子仍然使用《大數據技術 - 通俗理解MapReduce之WordCount》中的代碼。該 MR 做業數據傳輸過程以下:函數
由上圖能夠發現,每一個 map 任務的輸出都有重複的 key。假設每一個任務輸出記錄是幾百萬甚至幾千萬,重複的 key 會更多。這時若是咱們要減小 Shuffle 過程傳輸的數據量,咱們要怎麼辦呢?因爲咱們這個做業是個計數的任務,所以容易想到的方法是在 map 端輸出的時候對相同的 key 先作一遍計數,這樣作一來能夠減小數據量,二來不影響 reduce 端的統計結果。在 Hadoop 中若是要實現上述過程須要在 job 中指定 Combiner,代碼以下:oop
job.setMapperClass(WordCountMapper.class); //設置 map 任務的類 job.setCombinerClass(WordCountReducer.class); // 設置 Combiner job.setReducerClass(WordCountReducer.class); // 設置 reduce 任務的類
咱們能夠看到設置 Combiner 的 class 與 Reducer 相同,所以咱們說 Combiner 不會改變 reduce 的輸出結果。引入 Combiner 後,咱們的 MR 做業數據傳輸過程以下:性能
設置 Combiner 後,Shuffle 過程傳輸的數據量明顯減小。這裏就是咱們在寫 Shuffle 那篇文章中所說的,map 任務輸出到本地磁盤時會先判斷有沒有設置 Combiner ,若是有會調用 Combiner 作聚合以減小寫入磁盤的數據量,從而減小網絡 IO。Shuffle 還有一個過程會調用 Combiner 但在上圖沒有體現。那就是在 reduce 複製階段須要溢寫文件的時候,由於 reduce 接收來自不一樣的 map 輸出的數據,這時候會出現 key 相同的記錄,對相同 key 進行聚合一樣能夠減小輸出到磁盤的數據量,同時也能夠減小 reduce 函數對內存的佔用。學習
讀到這裏咱們已經清楚了 Combiner 的做用。可能有些讀者會說,我在 map 函數中把相同的 key 聚合起來不同能達到 map 輸出的聚合效果嗎, 一樣也能減小 Shuffle 過程的網絡 IO。但這種作法並不可取,緣由有三:大數據
可是引入 Combiner 就不會出現上述問題,這裏咱們總結一下爲何要引入 Combiner:優化
所以,我的認爲 Combiner 的設計是比較優秀的。咱們學習新東西的時候就是須要不斷的思考爲何要這樣設計,這樣設計的優缺點以及不這樣設計的優缺點,這樣咱們成長的會快。spa
到目前爲止咱們已經知道 Combiner 的優點很是明顯,可是不是全部的做業均可以設置 Combiner 呢?答案是否認的。對於咱們的 WordCount 這個例子來講,由於是求和操做,所以在任何階段進行求和不會影響最終的結果。可是有些做業是不行的,好比求平均值。若是在 map 輸出時或者 reduce 複製階段對一部分 key 先求了平均值,那是沒法保證最終 reduce 函數輸出的平均值是正確的。所以對於求最值、求和之類的統計咱們能夠設置 Combiner。設計
除了直接用 Reducer 設置 Combiner 外,咱們也能夠自定義 Combiner ,跟寫 Reducer 同樣,須要繼承 Reducer<K1, V1, K2, V2>,實現 reduce 方法。只要保證最終不影響 reduce 輸出結果便可。
總結一下這篇文章,在優化 MR 做業的 Shuffle 時能夠考慮引入 Combiner 來減小網絡 IO 和磁盤 IO。但通常針對特定的統計任務才能夠引入 Combiner ,如求最值、求和。同時,咱們也深刻分析引入 Combiner 在設計上的優點,既能夠靈活應用在各個階段進行聚合,又能夠將調優與業務邏輯解耦。