9

2 つの異なる mapreduce ジョブを実行するための 2 つの別個の Java クラスがあります。それらを独立して実行できます。操作対象の入力ファイルは、両方のジョブで同じです。したがって、私の質問は、1 つの Java クラスで 2 つのマッパーと 2 つのレデューサーを次のように定義できるかどうかです。

mapper1.class
mapper2.class
reducer1.class
reducer2.class

そして、好き

job.setMapperClass(mapper1.class);
job.setmapperClass(mapper2.class);
job.setCombinerClass(reducer1);
job.setCombinerClass(reducer2);
job.setReducerClass(reducer1);
job.setReducerClass(reducer2);

これらのセット メソッドは、実際に以前のものをオーバーライドするか、新しいメソッドを追加しますか? コードを試してみましたが、最新の指定されたクラスのみを実行するため、オーバーライドしていると思います。しかし、これを行う方法があるはずですよね?

私がこれを尋ねている理由は、入力ファイルを 1 回 (1 回の I/O) しか読み取れず、2 つのマップ削減ジョブを処理できるからです。また、出力ファイルを 2 つの異なるフォルダーに書き込む方法も知りたいです。現時点では、両方のジョブは別々であり、入力ディレクトリと出力ディレクトリが必要です。

4

4 に答える 4

12

複数のマッパーを使用できますが、1 つのジョブで使用できるレデューサーは 1 つだけです。必要な機能はMultipleInputMultipleOutputおよびGenericWritableです。

を使用しMultipleInputて、マッパーと対応する inputFormat を設定できます。使い方について書いた記事はこちら。

を使用GenericWritableすると、レデューサーで異なる入力クラスを分離できます。使い方について書いた記事はこちら。

を使用MultipleOutputすると、同じレデューサーで異なるクラスを出力できます。

于 2012-06-20T22:23:09.370 に答える
2

これには MultipleInputs および MultipleOutputs クラスを使用できますが、両方のマッパーの出力は両方のレデューサーに送られます。2 つのマッパー/リデューサー ペアのデータ フローが互いに独立している場合は、それらを 2 つの別個のジョブとして保持します。ところで、MultipleInputs は変更なしでマッパーを実行しますが、MultipleOutputs を使用するにはレデューサーを変更する必要があります。

于 2012-06-20T15:54:01.567 に答える
0

Hadoopストリーミングでmap-reduceを使用することから得られる私の理解によると、複数のマッパーとリデューサーをチェーンして、一方が別の出力を消費することができます

ただし、異なるマッパーとリデューサーを同時に実行することはできません。マッパー自体は、処理するブロックの数に依存します。マッパーは、ジョブに使用できるさまざまなマッパーではなく、その決定に基づいてインスタンス化する必要があります。

[編集:あなたのコメントに基づいて]

それは不可能だと思います。チェーン化できます (リデューサーはマッパーからすべての入力を受け取ります。それらをシーケンスすることはできますが、マッパーとリデューサーの独立したセットを排他的に実行することはできません。

あなたができることは、マッパーから両方のレデューサーへの両方の入力を受け取ったとしても、マッパーの出力 (K,V) をレデューサーでどのマッパーがあったかを区別できるような方法にすることができると思います(K,V) の原点。このようにして、両方のレデューサーが選択的な (K,V) ペアを処理できます。

于 2012-06-20T15:54:18.123 に答える
0

ChainMapperクラスを使用すると、1 つの Map タスク内で複数の Mapper クラスを使用できますたとえば、こちらをご覧ください

于 2016-04-17T22:44:51.143 に答える