天天看點

MR中的combiner問題

一、問題

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的完全一緻

三、總結

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它們倆進行同樣的操作。

繼續閱讀