1

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 クラスは特定のキーのすべての値を一度に受け取る必要があり、複数のパーティションに分割する必要はありません。

良いフィードバックをお待ちしております。

4

1 に答える 1

1

発生する奇妙なことは、コンバイナーが同じキーを複数回受け取ることです

コンバイナーは MapReduce フレームワークによって複数回呼び出される可能性があるため、これが可能です。JobConf#setCombinerClass()を参照してください。

フレームワークは、マッパー タスクとリデューサー タスクの両方で、コンバイナーを0 回、1 回、または複数回呼び出すことができます。一般に、コンバイナーは、ソート/マージの結果がディスクに書き込まれるときに呼び出されます。コンバイナは次のことを行う必要があります。

  • 副作用がないこと
  • 入力と出力のキーの型が同じで、入力と出力の値の型が同じである
于 2013-10-25T18:37:25.680 に答える