Hadoop深入學習 Combiner
阿新 • • 發佈:2019-01-04
在本節中,我們著重學習MapReduce程式設計模型中的Combiner元件。
每一個map都可能會產生大量的本地輸出,Combiner的作用就是對map端的輸出先做一次合併,以減少在map和reduce節點之間的資料傳輸量,以提高網路IO效能,是MapReduce的一種優化手段之一。
1)、Combiner最基本是實現本地key的聚合,對map輸出的key排序、value進行迭代。如下所示:
map:(key1,value1) ——> list(key2,value2)
conbine:(key2,list(value2)) ——> list(key2,value2)
reduce:(key2,list(value2)) ——> list(key3,value3)
2)、Combiner還有本地reduce功能(其本質上就是一個reduce):
map:(key1,value1) ——> list(key2,value2)
conbine:(key2,list(value2)) ——> list(key3,value3)
reduce:(key3,list(value3)) ——> list(key4,value4)
3)、如果不用Combiner,南無說有的結果都會在reduce端完成,效率比較低小,並且會佔用很多的網路IO;使用Combiner先完成在map端的本地聚合,可以減少網路傳輸資料量,提高效能。
但是,不要以為在寫MapReduce程式時設定了Combiner就認為Combiner一定會起作用,實際情況是這樣的嗎?答案是否定的。hadoop文件中也有說明Combiner可能被執行也可能不被執行。那麼在什麼情況下不執行呢?如果當前叢集在很繁忙的情況下job就是設定了也不會執行Combiner。
另外還要注意,Combiner使用的合適的話會提高Job作業的執行數度,但是使用不合適的話,會導致輸出的結果不正確。Combiner的輸出是Reduce的輸入,它絕不會改變最終的計算結果。
Conbiner的適用場景比如說在彙總統計時,就可以使用Conbiner,但是在求平均數的時候就是適合適用了。
最後,我們再來看一下Combiner的執行時機。我們之前已對map端的shuffle做過比較升入的瞭解,詳情請看MapTask詳解。那麼,Combiner會在map端的那個時期執行呢?實際上,Conbiner函式的執行時機可能會在map的merge操作完成之前,也可能在merge之後執行,這個時機由配置引數min.num.spill.for.combine(該值預設為3),也就是說在map端產生的spill檔案最少有min.num.spill.for.combine的時候,Conbiner函式會在merge操作合併最終的本機結果檔案之前執行,否則在merge之後執行。通過這種方式,就可以在spill檔案很多並且需要做conbine的時候,減少寫入本地磁碟的資料量,同樣也減少了對磁碟的讀寫頻率,可以起到優化作業的目的。
再分享一下我老師大神的人工智慧教程吧。零基礎!通俗易懂!風趣幽默!還帶黃段子!希望你也加入到我們人工智慧的隊伍中來!https://www.cnblogs.com/captainbed