天天看點

[Hadoop]Reducer總是能複用為Combiner?

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/

繼續閱讀