1

大規模なデータセットに対して何らかの計算を実行するには、複数の MapReduce ストリーミング ジョブをチェーンする必要があります。

ジョブ全体を高速化するために、ジョブごとに複数のレデューサーを使用するつもりです。ワークフロー スケジューラとして、Oozie を使用しています。

私の問題を明確にするための図を次に示します。2 つのファイルがあるとします。

File 1:          File 2:
A B 1            A B 3
A C 4            C D 6
B D 2            B D 1

2 つのマッパーと 2 つのレデューサーを用意して、MapReduce ジョブの次の出力を取得したいと考えています。

Output:
A B 4
A C 4
B D 3
C D 6

しかし、これは私が得たものではなく、部分的な合計です。

これが私が思うことです。

MapReduce ジョブごとに複数のレデューサーがあるため、次のジョブの入力はいくつかのファイルに分割されます。これらのファイルはマッパーに渡され、マッパーはその出力をレデューサーに送信します。マッパーは、入力全体が処理され、たとえば name1 をキーとしてソートされるのを待たずに、出力をレデューサーに送信しているようです。

複数のファイルを入力として使用することについていくつかのスレッドを読みましたが、マップ側の結合を実行することの問題ではないと思います。パーティショニングに関係しているのかもしれませんが、パーティショニングの内容を正確には理解していません。

レデューサーに送信する前に、複数のマッパーの出力を並べ替える方法はありますか? または、次の MapReduce Job の入力としてファイルを 1 つだけにするために、いくつかのレデューサーの出力をマージするように Oozie に指示できますか?

4

1 に答える 1

1

私はMapReduceに少し慣れていませんが、例に基づいて目的の出力が得られない場合、ジョブがキーを正しく処理していないようです.

デフォルトでは、Hadoop ストリーミングはタブをデフォルトのフィールド セパレータとして使用し、行頭から最初のタブ文字までのすべてをキーとして取得します。あなたの場合、入力形式が実際に「A [スペース] B [スペース] 1」の場合、追加する必要があります

-D stream.map.output.field.separator= \
-D stream.num.map.output.key.fields=2 \

スペースを列区切り記号として設定し、最初の 2 列をキーとして設定するために、Hadoop ストリーミング コマンドに追加します。これにより、「A B」で始まるすべての行が同じレデューサーにマップされます。詳細はこちら

于 2013-11-01T18:21:12.527 に答える