Hadoop Java API (1.0.3) で Map Reduce ジョブを作成しました。このジョブは、データ内の特定のフィールド (X) のすべての値を合計し、他のフィールドの加重分布を作成することで構成されています。
入力:
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
私のデータの任意の行に対して 1 つのペアが発行され、すべての値を合計するには 1 つのレデューサーを使用する必要があるため、同じ Reduce クラスを Combiner として設定することを考えました。
合計 X の合計:
マップ出力:
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 ...
デバッグのためにreduceメソッドの各呼び出しに渡されるすべてをstderrに記録しているので、これについて確信があります。
より具体的な例を追加したい:
データ:
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]
出力を減らします (コンバイナーを使用):
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
コンバイナーを削除すると、すべて正常に動作します。Combiner が 0 回、1 回、または複数回呼び出される可能性があることは理解していますが、Reducer はどうですか? 正確に 1 回呼び出す必要がありますね。
しかし、さらに奇妙なのは、フィールド分布に対して同様の手順を繰り返していることです。これは、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...) に対して同じ手順を繰り返します。
これらの発行されたペアの場合、レデューサーは、通常の動作と同様に、単一のキー (field1(class1)) と値の配列 ([fieldX(class1)...]) を受け取ります。
結論
考慮事項の 1 つは、X 合計問題の場合、単一のキー (X) がデータのサイズ (行数) に等しい数の値をマップすることです。一方、フィールド加重分布の場合、値はフィールドに含まれる複数のクラス ラベルに分散されます。
それは私のコードのバグですか、それとも私が考慮していない Hadoop の手続き上の詳細がありますか?
M/R パラダイムに従うと、Reducer クラスは特定のキーのすべての値を一度に受け取る必要があり、複数のパーティションに分割する必要はありません。
良いフィードバックをお待ちしております。