2013-10-25 34 views
1

我在Hadoop Java API(1.0.3)中編寫了一個Map Reduce作業。 這項工作包括總結我的數據中特定字段(X)的所有值,並創建其他字段的加權分佈。Java Hadoop - Reducer在使用組合器類時多次接收同一個鍵的不同值。

輸入:

1 field1_1 field2_1 field3_1 ... fieldX_1 
2 field1_2 field2_2 field3_2 ... fieldX_2 
3 field1_3 field2_3 field3_3 ... fieldX_3 

由於一對發射在我的數據,我需要爲了總結所有的值使用單個減速任意行,我想設置相同的減少類作爲一個合成器。

總計X總結:

MAP OUTPUT:

X fieldX_1 
X fieldX_2 
X fieldX_3 
X ... 

減少產量:

X fieldX_1+fieldX_2+fieldX_3+... 

出現這種情況奇怪的是,該組合/減速機接收相同的密鑰多個次:

X [fieldX_1 fieldX_1 fieldX_1 ... fieldX_1] 
X [fieldX_2 fieldX_2 fieldX_2 ...] 
X [fieldX_3 fieldX_3 fieldX_3 ...] 
X ... 

我相信這一點,因爲我登錄stderr傳遞給調用reduce方法的每個調用的所有內容。

我想補充一個更具體的例子:

數據:

1 field1_1 field2_1 field3_1 ... 10 
2 field1_2 field2_2 field3_2 ... 20 
3 field1_3 field2_3 field3_3 ... 30 
4 field1_1 field2_1 field3_1 ... 10 
5 field1_2 field2_2 field3_2 ... 40 
6 field1_3 field2_3 field3_3 ... 20 
... 

地圖輸出:

X 10 
X 20 
X 30 
X 10 
X 40 
X 20 

減少投入(含組合):

X [10 10 10 10] 
X [20 20 20] 
X [30 30 30 30 30 30 30] 
X [40 40] 

減少輸出(用梳子iner):

X 40 
X 60 
X 210 
X 80 

X是恆定標籤(字段名稱)。 要注意的是,用相同的鍵X和相同的X值集合來調用縮減器,例如, [10 10 10 ...]或[30 30 30 ...]。 每筆款項將單獨輸出。我的意思是算法運行良好,但在這個階段需要額外的減少步驟來總結重複。

真實記錄例如:

Nov 06, 2013 8:50:12 AM MYCLASS logInputError 
WARNING: REDUCE-INPUT: X,[10.0] 
Nov 06, 2013 8:50:12 AM MYCLASS logOutputError 
WARNING: REDUCE-OUTPUT: X,10.0 
Nov 06, 2013 8:50:12 AM MYCLASS logInputError 
WARNING: REDUCE-INPUT: X,[25.865, 25.865] 
Nov 06, 2013 8:50:12 AM MYCLAS logOutputError 
WARNING: REDUCE-OUTPUT: X,51.73 
Nov 06, 2013 8:50:12 AM MYCLASS logInputError 
WARNING: REDUCE-INPUT: X,[1449271.4, 1449271.4, 1449271.4, 1449271.4, 1449271.4, 1449271.4, 1449271.4, 1449271.4, 1449271.4, 1449271.4, 1449271.4, 1449271.4, 1449271.4, 1449271.4] 
Nov 06, 2013 8:50:12 AM MYCLASS logOutputError 
WARNING: REDUCE-OUTPUT: X,2.0289798E7 
Nov 06, 2013 8:50:12 AM MYCLASS logInputError 
WARNING: REDUCE-INPUT: X,[514994.53, 514994.53, 514994.53, 514994.53, 514994.53, 514994.53, 514994.53, 514994.53, 514994.53, 514994.53, 514994.53, 514994.53, 514994.53] 
Nov 06, 2013 8:50:12 AM MYCLASS logOutputError 
WARNING: REDUCE-OUTPUT: X,6694929.0 
Nov 06, 2013 8:50:12 AM MYCLASS logInputError 
WARNING: REDUCE-INPUT: X,[1438665.5, 1438665.5, 1438665.5, 1438665.5, 1438665.5, 1438665.5, 1438665.5, 1438665.5, 1438665.5, 1438665.5, 1438665.5, 1438665.5, 1438665.5] 
Nov 06, 2013 8:50:12 AM MYCLASS logOutputError 
WARNING: REDUCE-OUTPUT: X,1.8702654E7 

如果刪除該組合一切工作正常。 我知道組​​合器可能會被調用0次,1次或多次,但是Reducer呢?它應該被調用一次,不是嗎?

但更奇怪的是,我重複類似的過程的字段分佈,這隻發生在X總結問題...

加權場分佈

MAP OUTPUT(例如字段1):

field1_1 X_1 
field1_2 X_2 
field1_3 X_3 
... 

減少產量:

field1(class1) fieldX(class1)+fieldX(class1)+fieldX(class1)+... 
field1(class2) fieldX(class2)+fieldX(class2)+fieldX(class2)+... 
field1(class3) fieldX(class3)+fieldX(class3)+fieldX(class3)+... 
... 

本質,爲field1的每個值,我總結了所有的關聯fieldX的值並對幾個字段(field1,field2,field3 ...)重複相同的過程。

對於那些發出的對,reducer接收單個鍵(field1(class1))和值的數組(fieldX(class1)...]),通常應該這樣做。

結論

一個考慮是對X求和問題的單個密鑰(X)映射多個值等於該數據的大小(行數)。同時,對於字段加權分佈,這些值分佈在字段包含的幾個類別標籤中。

這是我的代碼中的錯誤還是有一些我不考慮Hadoop的程序細節?

站在M/R範例中,Reducer類應該一次接收特定鍵的所有值,而不是分割到更多分區中。

希望收到良好的反饋意見。

+0

你是怎麼找到最終?我有一個類似的問題,沒有組合我得到了多個列表中的同一個鍵在reducer,也就是,而不是{x,[1,2,3]}我得到{x,[1,2]} {x,[3 ]}? – Marko

+0

您使用的是哪種Hadoop分佈? –

+0

由於某些限制,我使用Hadoop 0.20.2。 – Marko

回答

1

出現這種情況奇怪的是,組合器接收相同的密鑰多次

這是可能的組合可以由MapReduce框架被多次調用,見JobConf#setCombinerClass()

該框架可能會調用合併器0,1或多個次,在 這兩個mapper和reducer任務中。一般來說,組合器被稱爲 排序/合併結果被寫入磁盤。該合併必須:

  • 是沒有副作用
  • 具有相同的輸入和輸出密鑰類型和相同的輸入和輸出值類型
+0

謝謝。我期待在地圖後多次調用組合器,但我不知道在縮減中也可能調用該組合器。我將Reducer任務的數量設置爲1,因爲我想把所有東西都集中在一個地方,但似乎有幾個輸出使用了相同的密鑰。 任何建議如何解決它? –

+0

也許這個班有什麼問題,你用作鑰匙?或者在你的reducer中輸出同一個鍵的多個值?沒有看到實際的代碼很難說。此外,您對減少過程/問題的描述相當複雜。嘗試重新解釋您的問題並提供更具體的示例。 – harpun

+0

我編輯了這個問題,添加了一個更具體的例子。 –

相關問題