2012-08-22 9 views
6

すべてのレデューサーに特定のレコードを送信するにはどうすればよいですか?Hadoopはすべてのレデューサーにレコードを送信します

私はPartitionerクラスとそれが何をしているのか知っていますが、すべてのレデューサーにレコードを確実に渡すための簡単な方法はありません。

基本的には、パーティショナは、この方法があります:マッパーがレコードに減らすの数だけを出力し続ける:次のように私の最初のアイデアが協力パーティショナとマッパーを持っていることでした

int getPartition(K2 key, 
      V2 value, 
      int numPartitions) 

Partitionerはすべてのint(0からnumPartitions-1)を返します。これにより、レコードがすべてのパーティションに到達するようになります。

これを解決する他のスマートな方法はありますか?例えば、私はすべてのパーティションに送られる必要があるレコードに対して-1を返し、フレームワークは返された-1を見ると私のためにそれを行います。

答えて

5

パーティショナーはそのようには機能しません。その仕事は、キー(通常)と値(まれに)を見て、ペアをどのレデューサーに送るべきかを決定することです。これは、マッパーの後で減速機の前で起こります。

代わりに、あなた(マッパー)は、リデューサー(パーティション)の総数に答えることができる構成をコンテキストに尋ねることができます。マッパーは、実際のキーとパーティション番号を含む複雑なキーを出力できます。マッパーが減速機の数を知ることができるので(上記を参照)、これを書き留める回数は分かります。パーティショニング担当者はすべて、コンポジット・キー値を分解し、ターゲット・レデューサー索引を抽出し、その索引を戻すだけです。

ところで、この手法を使用して、ソートしている場合はカウントを送信したり、後で処理で使用する他のメタデータを送信すると、実際のデータキーは同じコンポジットに従わなければなりませんフォーマット。実際には、コンポジットキーにキー/値のペアの種類を示すインジケータを含める必要があります(たとえば、1 =実データ、0 =メタデータの処理)。

+0

また、必要とするグループ化コンパレータに関するこの回答を更新する必要があります。 –

+0

これも私が考えていた方法です。私はそれを非常にはっきりと説明していませんでした。また、Partitionerオブジェクトにカウンタを持って戻ってきた次のパーティションを追跡することも考えていました。しかし、PartitionerオブジェクトがGC化され、カウンタがリセットされる可能性があるため、これが解決策であるかどうかはわかりません。 グループ化コンパレータに関しては、これは私が記述していない私の要件に依存すると私は思う。私は必要に応じて戻ってきます。 ありがとう! – Razvan

関連する問題