2017-02-07 62 views

回答

1

您可以將所有輸入元組映射到同一個鍵,其值與每個輸入元組相同,如(one-key,(Ben,20)),並使用reduce函數僅返回具有最高等級的元組(因爲只有一個密鑰)。

爲了確保MR並行性能夠開始,使用具有與reducer相同功能的組合器(上圖)應該可以做到。這樣,縮減器將只從每個映射器獲得一個元組,並且將做更少的工作。

編輯:更好的是,您已經可以消除映射函數中除max以外的所有元素,以獲得最佳性能(請參閱Venkat的說法,即不保證使用組合器)。

實施例具有兩個映射器:

Paul 90 
Ben 20 
Cook 80 
Joe 85 

映射到:

Mapper 1 
(the-one-key, (Paul, 90)) 
(the-one-key, (Ben, 20)) 

Mapper 2 
(the-one-key, (Cook, 80)) 
(the-one-key, (Joe, 85)) 

組合以(仍然在映射器側):

Mapper 1 
(the-one-key, (Paul, 90)) 

Mapper 2 
(the-one-key, (Joe, 85)) 

簡化爲:

(the-one-key, (Paul, 90)) 

最後一句話:如果你有一個小的數據集,MapReduce可能「太多」了。如果只有幾百或幾千個值,則在本地內存中進行簡單掃描會更快。

+0

這種方法有一個缺點,我們必須處理reducer中的每個記錄以獲得最大值。使用二次排序會更好。 – Venkat

+0

我同意這可能是潛在的問題,但在我的理解中,組合器解決了這個問題,並且reducer只會獲得與映射器一樣多的記錄。 –

+0

好點。但如果不能保證組合器的執行。所以每個映射器一個記錄是不正確的假設。這就是說減速器的記錄數量將大大低於輸入記錄。 – Venkat

1

這樣做的一個好方法是在Hadoop中進行二次排序。您的地圖輸出鍵應該是(名稱,標記)的組合。

然後,您可以實現一個自定義比較器,該比較器可以根據標記僅接受比較2給定的值並基於較高的標記進行排序來取得該關鍵字&。

通常我們實現一個分組比較器,但在這種情況下,我們希望所有的鍵都進入一個簡化器。所以我們會忽略分組比較器中的關鍵差異。

在減速機剛剛得到第一個值&退出。次要排序的

詳細說明:Secondary Sort

0

看看下面的代碼在要旨:

https://gist.github.com/meshekhar/6dd773abf2af6ff631054facab885bf3

在映射器,數據被映射到鍵值對:

key: "Paul 90" 
key: "Ben 20" 
key: "Cook 80" 
key: "Joe 85" 

在reducer中,使用while循環遍歷所有記錄,每個值被分割成名稱和標記,並且ma x標記存儲在臨時變量中。

最後,返回最大值和相應的名稱對。例如Paul 90.

我在單節點系統上測試了它,記錄超過100萬條,時間不到10秒。

相關問題