異なる入力を処理する 2 つのマッパー クラスがありますが、それらの出力は同じ形式になり、同じレデューサーに送られます。2 つのマッパー クラスの 1 つだけにコンバイナーを実装することは可能ですか?
3 に答える
コンバイナーを使用するように Hadoop MR を設定すると、すべてのマッパーからの出力が処理されます。特定のマッパーを指定することはできません。
おそらく、次の 2 つのオプションを検討してください。
コンバイナーをすべての出力に適用します。マッパーからの出力を共通のタイプにマッピングして、リデューサーによって処理 (結合?) できるようにします。データの元のマッパーに関係なく、結合が機能するかどうかを検討してください。このアイデアを変更すると、マッパーから出力されたキーまたは値に型変数を設定し、それを結合で使用して天気を決定し、何かを行うことができます。
マップ ローカル結合を使用します。マッパーの 1 つからの出力が適切に結合されることがわかっている場合は、マッパー自体の中で集計/結合を行い、出力を定期的に書き込むだけにすることができます。これがうまく機能するには、ジョブへの入力データについて十分な知識が必要です。
クエリは少し不明確です。同じコンバイナを再利用して 2 つの異なるマッパーの出力を結合することについて質問されていると思います。2 つのマッパーの出力が同じであるため、可能であるはずです。
MultipleInputsクラスを使用して 1 つのジョブで 2 つのマッパーを使用することも、2 つの異なるジョブで使用することもできます。いずれの場合も、コンバイナはジョブごとに指定する必要があります。
また、
1) マッパーの o/p は、リデューサーの i/p と一致する必要があります。
2) マッパーの o/p は、コンバイナーの i/p と一致する必要があります。
3) コンバイナの i/p と o/p は同じタイプでなければなりません。
最後のチェーンマッパーに適用可能なコンバイナー、サンプルコード添付
ChainMapper.addMapper(job, SalesRecordMapper.class, LongWritable.class, Text.class, Text.class, DoubleWritable.class, configuration);
ChainMapper.addMapper(job, ItemDiscountMapper.class, Text.class, DoubleWritable.class, Text.class, DoubleWritable.class, configuration);
job.setCombinerClass(DoubleReducer.class);