6

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

Partitioner クラスとその機能は知っていますが、レコードがすべてのレデューサーに送信されるようにする簡単な方法がわかりません。

基本的に、パーティショナーには次のメソッドがあります。

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

私の最初のアイデアは、Partitioner と Mapper を次のように連携させることでした: Mapper は reduce タスクの数に等しい回数だけレコードを出力し続け、Partitioner はすべての int (0 から numPartitions-1 まで) を返します。レコードがすべてのパーティションに到達していることを確認してください。

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

4

1 に答える 1

5

パーティショナーはそのようには機能しません。その仕事は、キー (通常) と値 (まれに) を調べて、ペアを送信するレデューサーを決定することです。これは、マッパーの後、リデューサーの前に発生します。

代わりに、あなた (マッパー) は、リデューサー (パーティション) の総数に答えることができる構成のコンテキストを尋ねることができるはずです。その後、マッパーは、必要な実際のキーとパーティション番号で構成される複雑なキーを出力できます。マッパーはレデューサーの数を見つけることができるため、これを何回書き出すかはわかります (上記を参照)。パーティショナーが行う必要があるのは、複合キー値を分解し、ターゲットのレデューサー インデックスを抽出して、そのインデックスを返すことだけです。

ところで、これは、この手法を使用してカウント (ソートしている場合) または他のメタデータを後で処理で使用するために使用する場合、実際のデータ キーは同じ複合形式に従う必要があることを意味します。実際、複合キーには、キーと値のペアの種類を表すインジケーターを含める必要があるでしょう (例: 1 = 実際のデータ、0 = 処理中のメタデータ)。

于 2012-08-23T00:38:49.173 に答える