在Hadoop中,有一種處理過程叫Combiner,與Mapper和Reducer在處於同等地位,但其執行的時間介於Mapper和Reducer之間,其實就是Mapper和Reducer的中間處理過程,Mapper的輸出是Combiner的輸入,Combiner的輸出是Reducer的輸入。網絡
例如獲取歷年的最高溫度例子,以書中所說的1950年爲例,在兩個不一樣分區上的Mapper計算得到的結果分別以下:app
第一個Mapper結果:(1950, [0, 10, 20])oop
第二個Mapper結果:(1950, [25, 15])效率
若是不考慮Combiner,按照正常思路,這兩個Mapper的結果將直接輸入到Reducer中處理,以下所示:方法
MaxTemperature:(1950, [0, 10, 20, 25, 15])數據
最終獲取的結果是25。時間
若是考慮Combiner,按照正常思路,這兩個Mapper的結果將分別輸入到兩個不一樣的Combiner中處理,得到的結果分別以下所示:
第一個Combiner結果:(1950, [20])
第二個Combiner結果:(1950, [25])
而後這兩個Combiner的結果會輸出到Reducer中處理,以下所示
MaxTemperature:(1950, [20, 25])
最終獲取的結果是25。
由上可知:這兩種方法的結果是一致的,使用Combiner最大的好處是節省網絡傳輸的數據,這對於提升總體的效率是很是有幫助的。
可是,並不是任什麼時候候均可以使用Combiner處理機制,例如不是求歷年的最高溫度,而是求平均溫度,則會有另外一種結果。一樣,過程以下,
若是不考慮Combiner,按照正常思路,這兩個Mapper的結果將直接輸入到Reducer中處理,以下所示:
AvgTemperature:(1950, [0, 10, 20, 25, 15])
最終獲取的結果是14。
若是考慮Combiner,按照正常思路,這兩個Mapper的結果將分別輸入到兩個不一樣的Combiner中處理,得到的結果分別以下所示:
第一個Combiner結果:(1950, [10])
第二個Combiner結果:(1950, [20])
而後這兩個Combiner的結果會輸出到Reducer中處理,以下所示
AvgTemperature:(1950, [10, 20])
最終獲取的結果是15。
由上可知:這兩種方法的結果是不一致的,因此在使用Combiner時,必定三思然後行,仔細思量其是否適合,不然可能形成沒必要要的麻煩。