Combiner
函數是一個可選的中間函數,發生在
Map
階段,
Mapper
執行完成後立即執行。使用
Combiner
有如下兩個優勢:
-
可以用來減少發送到Combiner
的資料量,進而提高網絡效率。Reducer
-
可以用于減少發送到Combiner
的資料量,這将提高Reducer
端的效率,因為每個Reduce
函數将處理相比于未使用reduce
之前更少的記錄。Combiner
Combiner
與
Reducer
結構相同,因為
Combiner
和
Reducer
都對
Mapper
的輸出進行處理。這給了我們一個複用
Reducer
作為
Combiner
的好機會。但問題是,複用
Reducer
Combiner
總是可行的嗎?
1. Reducer作為Combiner的适用場景 http://gitlab.corp.qunar.com/jifeng.si/learningnotes/blob/master/IT/%E5%A4%A7%E6%95%B0%E6%8D%AE/Hadoop/%5BHadoop%5DHadoop%E6%8C%87%E5%8D%97%E5%8D%81%E4%B8%89%20Reducer%E6%80%BB%E6%98%AF%E8%83%BD%E5%A4%8D%E7%94%A8%E4%B8%BACombiner%EF%BC%9F.md#1-reducer-combiner
假設我們正在編寫一個
MapReduce
程式來計算股票資料集中每個股票代碼的最大收盤價。
Mapper
将資料集中每個股票記錄的股票代碼作為key和收盤價作為value。
Reducer
然後将循環周遊股票代碼對應的所有收盤價,并從收盤價清單中計算最高收盤價。假設
Mapper 1
處理股票代碼為
ABC
的3個記錄,收盤價分别為50,60和111。讓我們假設
Mapper 2
處理股票代碼為ABC的2個記錄,收盤價分别為100和31。那麼
Reducer
将收到股票代碼ABC五個收盤價---50,60,111,100和31。Reducer的工作非常簡單,它将簡單地循環周遊所有收盤價,并将計算最高收盤價為111。
我們可以在每個
Mapper
之後使用相同的
Reducer
Combiner
。
Mapper 1
上的
Combiner
将處理3個收盤價格--50,60和111,并且僅輸出111,因為它是3個收盤價的最大值。
Mapper 2
Combiner
将處理2個收盤價格--100和31,并且僅輸出100,因為它是2個收盤價的最大值。現在使用
Combiner
之後,
Reducer
僅處理股票代碼ABC的2個收盤價(原先需要處理5個收盤價),即來自
Mapper 1
的111和來自
Mapper 2
的100,并且将從這兩個值中計算出最大收盤價格為111。
正如我們看到的,使用
Combiner
情況下
Reducer
輸出與沒有使用
Combiner
的輸出結果是相同的,是以在這種情況下複用
Reducer
Combiner
是沒有問題。
2. Reducer作為Combiner的不适用場景 http://gitlab.corp.qunar.com/jifeng.si/learningnotes/blob/master/IT/%E5%A4%A7%E6%95%B0%E6%8D%AE/Hadoop/%5BHadoop%5DHadoop%E6%8C%87%E5%8D%97%E5%8D%81%E4%B8%89%20Reducer%E6%80%BB%E6%98%AF%E8%83%BD%E5%A4%8D%E7%94%A8%E4%B8%BACombiner%EF%BC%9F.md#2-reducer-combiner
MapReduce
程式來計算股票資料集中每個股票代碼的平均交易量(average volume for each symbol)。
Mapper
将資料集中每個股票記錄的股票代碼作為key和交易量(volume)作為value。
Reducer
然後将循環周遊股票代碼對應的所有交易量,并從交易量清單中計算出平均交易量(average volume from the list of volumes for that symbol)。假設
Mapper 1
處理股票代碼為ABC的3個記錄,收盤價分别為50,60和111。讓我們假設
Mapper 2
Reducer
将收到股票代碼ABC五個收盤價---50,60,111,100和31。Reducer的工作非常簡單,它将簡單地循環周遊所有交易量,并将計算出平均交易量為70.4。
50 + 60 + 111 + 100 + 31 / 5 = 352 / 5 = 70.4
讓我們看看如果我們在每個
Mapper
之後複用
Reducer
Combiner
會發生什麼。
Mapper 1
Combiner
将處理3個交易量--50,60和111,并計算出三個交易量的平均交易量為73.66。
Mapper 2
Combiner
将處理2個交易量--100和31,并計算出兩個交易量的平均交易量為65.5。那麼在複用
Reducer
Combiner
的情況下,
Reducer
僅處理股票代碼ABC的2個平均交易量,來自
Mapper1
的73.66和來自
Mapper2
的65.5,并計算股票代碼ABC最終的平均交易量為69.58。
73.66 + 65.5 /2 = 69.58
這與我們不複用
Reducer
Combiner
得出的結果不一樣,是以複用
Reducer
Combiner
得出平均交易量是不正确的。
是以我們可以看到
Reducer
不能總是被用于
Combiner
。是以,當你決定複用
Reducer
Combiner
的時候,你需要問自己這樣一個問題:使用
Combiner
與不使用
Combiner
的輸出結果是否一樣?
3. 差別 http://gitlab.corp.qunar.com/jifeng.si/learningnotes/blob/master/IT/%E5%A4%A7%E6%95%B0%E6%8D%AE/Hadoop/%5BHadoop%5DHadoop%E6%8C%87%E5%8D%97%E5%8D%81%E4%B8%89%20Reducer%E6%80%BB%E6%98%AF%E8%83%BD%E5%A4%8D%E7%94%A8%E4%B8%BACombiner%EF%BC%9F.md#3
Combiner
需要實作
Reducer
接口。
Combiner
隻能用于特定情況。
-
不同,Reducer
有一個限制,Combiner
輸入/輸出鍵和值類型必須與Combiner
的輸出鍵和值類型相比對。而Mapper
隻是輸入鍵和值類型與Reducer
的輸出鍵和值類型相比對。Mapper
-
隻能用于滿足交換律Combiner
和結合律(a.b = b.a)
的情況。這也意味着(a.(b.c)= (a.b).c)
可能隻能用于鍵和值的一個子集或者可能不能使用。Combiner
-
可以從多個Reducer
擷取資料。Mapper
隻能從一個Combiner
擷取其輸入。Mapper
原文:
http://hadoopinrealworld.com/can-reducer-always-be-reused-for-combiner/