1. 程式人生 > >【Hadoop】Combiner的本質是迷你的reducer,不能隨意使用

【Hadoop】Combiner的本質是迷你的reducer,不能隨意使用

現在 使用 article driver eight 操作類 組合 通過 技術

問題提出:

眾所周知,Hadoop框架使用Mapper將數據處理成一個<key,value>鍵值對,再網絡節點間對其進行整理(shuffle),然後使用Reducer處理數據並進行最終輸出。 在上述過程中,我們看到至少兩個性能瓶頸:(引用)

  1. 如果我們有10億個數據,Mapper會生成10億個鍵值對在網絡間進行傳輸,但如果我們只是對數據求最大值,那麽很明顯的Mapper只需要輸出它所知道的最大值即可。這樣做不僅可以減輕網絡壓力,同樣也可以大幅度提高程序效率。
  2. 使用專利中的國家一項來闡述數據傾斜這個定義。這樣的數據遠遠不是一致性的或者說平衡分布的,由於大多數專利的國家都屬於美國,這樣不僅Mapper中的鍵值對、中間階段(shuffle)的鍵值對等,大多數的鍵值對最終會聚集於一個單一的Reducer之上,壓倒這個Reducer,從而大大降低程序的性能。

目標:

Mapreduce中的Combiner就是為了避免map任務和reduce任務之間的數據傳輸而設置的,Hadoop允許用戶針對map task的輸出指定一個合並函數。即為了減少傳輸到Reduce中的數據量。它主要是為了削減Mapper的輸出從而減少網絡帶寬和Reducer之上的負載。

數據格式轉換:

map: (K1, V1) → list(K2,V2)
combine: (K2, list(V2)) → list(K3, V3)
reduce: (K3, list(V3)) → list(K4, V4)

註意:combine的輸入和reduce的完全一致,輸出和map的完全一致

使用註意:

對於Combiner有幾點需要說明的是:

1)有很多人認為這個combiner和map輸出的數據合並是一個過程,其實不然,map輸出的數據合並只會產生在有數據spill出的時候,即進行merge操作。

2)與mapper與reducer不同的是,combiner沒有默認的實現,需要顯式的設置在conf中才有作用。

3)並不是所有的job都適用combiner,只有操作滿足結合律的才可設置combiner。combine操作類似於:opt(opt(1, 2, 3), opt(4, 5, 6))。如果opt為求和、求最大值的話,可以使用,但是如果是求中值的話,不適用。

4)一般來說,combiner和reducer它們倆進行同樣的操作。

但是:特別值得註意的一點,一個combiner只是處理一個結點中的的輸出,而不能享受像reduce一樣的輸入(經過了shuffle階段的數據),這點非常關鍵。具體原因查看下面的數據流解釋:

融合combiner的數據流

技術分享

插入了Combiner的MapReduce數據流
  Combiner:前面展示的流水線忽略了一個可以優化MapReduce作業所使用帶寬的步驟,這個過程叫Combiner,它在Mapper之後Reducer之前運行。Combiner是可選的,如果這個過程適合於你的作業,Combiner實例會在每一個運行map任務的節點上運行。Combiner會接收特定節點上的Mapper實例的輸出作為輸入,接著Combiner的輸出會被發送到Reducer那裏,而不是發送Mapper的輸出。Combiner是一個“迷你reduce”過程,它只處理單臺機器生成的數據(特別重要,作者在做一個矩陣乘法的時候,沒有領會到這點,把它當成一個完全的reduce的輸入數據來處理,結果出錯。)。
  詞頻統計是一個可以展示Combiner的用處的基礎例子,上面的詞頻統計程序為每一個它看到的詞生成了一個(word,1)鍵值對。所以如果在同一個文檔內“cat”出現了3次,(”cat”,1)鍵值對會被生成3次,這些鍵值對會被送到Reducer那裏。通過使用Combiner,這些鍵值對可以被壓縮為一個送往Reducer的鍵值對(”cat”,3)。現在每一個節點針對每一個詞只會發送一個值到reducer,大大減少了shuffle過程所需要的帶寬並加速了作業的執行。這裏面最爽的就是我們不用寫任何額外的代碼就可以享用此功能!如果你的reduce是可交換及可組合的,那麽它也就可以作為一個Combiner。你只要在driver中添加下面這行代碼就可以在詞頻統計程序中啟用Combiner。

參考資料:

http://blog.csdn.net/guoery/article/details/8529004

http://blog.csdn.net/guoery/article/details/8529004

【Hadoop】Combiner的本質是迷你的reducer,不能隨意使用