我在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類應該一次接收特定鍵的所有值,而不是分割到更多分區中。
希望收到良好的反饋意見。
你是怎麼找到最終?我有一個類似的問題,沒有組合我得到了多個列表中的同一個鍵在reducer,也就是,而不是{x,[1,2,3]}我得到{x,[1,2]} {x,[3 ]}? – Marko
您使用的是哪種Hadoop分佈? –
由於某些限制,我使用Hadoop 0.20.2。 – Marko