3

データの処理中に出力を3つの異なるタイプに分類するマッパーがあります(タイプは出力キーです)。私の目標は、レデューサーを介して 3 つの異なる csv ファイルを作成し、それぞれにヘッダー行を持つ 1 つのキーのすべてのデータを作成することです。

キー値は変更可能で、テキスト文字列です。

さて、理想的には、3 つの異なるレデューサーが必要であり、各レデューサーは値のリスト全体で 1 つのキーのみを取得します。

ただし、キーが特定のレデューサーにマップされないため、これは機能しないようです。

他の場所でのこれに対する答えは、必要な各キー値を特定のレデューサーにマップするカスタム パーティショナー クラスを作成することでした。Pythonでストリーミングを使用する必要があり、ジョブにカスタムストリーミングjarを含めることができないため、これはオプションではないように思われることを除いて、これは素晴らしいことです。

Hadoop のドキュメントで、セカンダリ ソートを有効にできる代替のパーティショナー クラスがあることがわかりますが、デフォルトまたはキー フィールド ベースのパーティショナーのいずれかを使用して、各キーが確実に終了するようにすることが可能であることはすぐにはわかりません。Java クラスを作成したり、カスタム ストリーミング jar を使用したりせずに、独自のレデューサーを使用します。

どんな提案でも大歓迎です。

:

マッパー出力:

csv2\tfieldA,fieldB,fieldC csv1\tfield1,field2,field3,field4 csv3\tfieldRed,fieldGreen ...

問題は、3つのレデューサーがある場合、次のようなキー配布になることです:

reducer1        reducer2        recuder3
csv1            csv2
csv3

1 つのレデューサーは 2 つの異なるキー タイプを取得し、1 つのレデューサーはデータをまったく送信しません。これは、hash(key csv1) mod 3 と hash(key csv2) mod 3 が同じ値になるためです。

4

3 に答える 3

1

MultipleOutputFormat[1]はストリーミングで使用できると確信しています。それはあなたの問題のほとんどを解決します。

http://hadoop.apache.org/common/docs/r0.20.1/api/org/apache/hadoop/mapred/lib/MultipleOutputFormat.html

于 2011-10-24T21:58:09.503 に答える
1

ストリーミングに行き詰まっていて、カスタム パーティショナー用の外部 jar を含めることができない場合、これはおそらくハックなしでは思い通りに動作しないでしょう。

これらが絶対的な要件であれば、これを回避できますが、面倒です。

できることは次のとおりです。

デフォルトでは、Hadoop は次のようなハッシュ パーティショナーを使用します。

key.hashCode() % numReducers

したがって、1、2、および 3 (または のような 3 つの数値x % 3 = 1, 2, 3) にハッシュされるようなキーを選択できます。これは厄介なハックであり、他に選択肢がない場合を除き、お勧めしません。

于 2011-09-18T03:33:17.893 に答える
1

別の csv ファイルへのカスタム出力が必要な場合は、(API を使用して) hdfs に直接書き込むことができます。ご存じのように、hadoop はキーと関連する値のリストと共に単一の reduce タスクに渡します。キーが同じファイルに同じ書き込みをしている間、削減コードでは、チェックします。別のキーが来たら、手動で新しいファイルを作成して書き込みます。レデューサーの数は関係ありません

于 2011-09-20T12:26:57.757 に答える