データの処理中に出力を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 が同じ値になるためです。