2012-06-16 7 views
12

Hadoop MapReduceに複数の異なるマッパーを複数入力することは可能ですか?各マッパークラスは異なる入力セットで動作しますが、それらはすべて同じレデューサーによって消費されるキーと値のペアを放出します。ここでは、マッパーを連鎖させることについては言及していませんが、私は、異なるマッパーを並行して実行しています。Hadoop MapReduceに複数の異なるマッパーを持つ複数の入力を持つことは可能ですか?

答えて

13

これは結合と呼ばれます。

mapred。*パッケージ(以前はサポートされていましたが、まだサポートされています)にマッパーとレデューサーを使いたいとします。新しいパッケージ(mapreduce。*)では、1つのマッパー入力のみが可能です。 mapredパッケージを使用すると、結合を定義するためにMultipleInputsクラスを使用します。

MultipleInputs.addInputPath(jobConf, 
        new Path(countsSource),  
        SequenceFileInputFormat.class, 
        CountMapper.class); 
MultipleInputs.addInputPath(jobConf, 
        new Path(dictionarySource), 
        SomeOtherInputFormat.class, 
        TranslateMapper.class); 

jobConf.setJarByClass(ReportJob.class); 
jobConf.setReducerClass(WriteTextReducer.class); 

jobConf.setMapOutputKeyClass(Text.class); 
jobConf.setMapOutputValueClass(WordInfo.class); 

jobConf.setOutputKeyClass(Text.class); 
jobConf.setOutputValueClass(Text.class); 
+5

新しいapis( 'mapreduce'は' mapred'ではありません)には 'MultipleInputs'があります:http://hadoop.apache.org/common/docs/r1.0.3/api/org/apache/hadoop/mapreduce/lib /input/MultipleInputs.html –

+0

@Donald Miner:もちろんそうです。 –

+0

@DonaldMinerいくつかのバージョンはありますが、少なくとも0.20.xはそうではないようです。ここでMultipleInputsの欠如に注意してください:http://hadoop.apache.org/docs/r0.20.205.0/api/org/apache/hadoop/mapreduce/lib/input/ – kabuko

2

は、私は質問、2件の回答、及び抗勧告であなたの質問にお答えします。

異種マッピングジョブを並行して実行するときに、どのような利点がありますか?正しくシャッフルできる均質な結果が出力されますか?アイデンティティマップを使用して同じレコードを2回渡すことを避けるというアイデアですか?

最初の答えは、艦隊の半分(または入力データサイズに最も適した比率)のマッパー専用ジョブを同時にスケジュールし、均質な結果を出力し、続いて結合を実行する減速専用ジョブを実行することです。

2番目の答えは、異種入力の両方のフレーバーを認識して変換できるカスタムのInputFormatを作成することです。これは非常に醜いですが、最初の提案の不要なアイデンティティマップを避けることができます。

反推奨はではありません。では、Chrisの回答から廃止予定のHadoop APIを使用しています。 Hadoopは非常に若いですが、APIは「新しい」フレーバーの周りで安定しています。あなたは最終的にバージョンロックインに到着するでしょう。

+0

いくつかのマッパーを実行する理由は、 FlumeJavaの論文に示されているようにフラット化された操作を実装します。異なるマッパーからの出力は、同じシャッフル操作に参加することができます。 – tibbe

関連する問題