4

私のmap-reduceジョブでは、4つのレデューサーを使用してレデューサージョブを実装しています。したがって、これを行うことにより、最終出力は4つのパーツファイルを生成します。:part-0000 part-0001 part-0002 part-0003

私の質問は、hadoopが4つのレデューサーを使用して機能するにもかかわらず、hadoopの構成を1つのパーツファイルのみを出力するように設定するにはどうすればよいですか?

4

2 に答える 2

8

これは、Hadoopに期待される動作ではありません。MultipleOutputsただし、ここで有利に使用できます。名前付き出力を1つ作成し、それをすべてのレデューサーで使用して、1つのファイル自体で最終出力を取得します。javadoc自体が次のことを示唆しています。

 JobConf conf = new JobConf();

 conf.setInputPath(inDir);
 FileOutputFormat.setOutputPath(conf, outDir);

 conf.setMapperClass(MOMap.class);
 conf.setReducerClass(MOReduce.class);
 ...

 // Defines additional single text based output 'text' for the job
 MultipleOutputs.addNamedOutput(conf, "text", TextOutputFormat.class,
 LongWritable.class, Text.class);;
 ...

 JobClient jc = new JobClient();
 RunningJob job = jc.submitJob(conf);

 ...

ジョブ構成の使用パターンは次のとおりです。

public class MOReduce implements
   Reducer<WritableComparable, Writable> {
 private MultipleOutputs mos;

 public void configure(JobConf conf) {
 ...
 mos = new MultipleOutputs(conf);
 }

 public void reduce(WritableComparable key, Iterator<Writable> values,
 OutputCollector output, Reporter reporter)
 throws IOException {
 ...
 mos.getCollector("text", reporter).collect(key, new Text("Hello"));
 ...
 }

 public void close() throws IOException {
 mos.close();
 ...
 }

 }

mapreduce新しいAPIを使用している場合は、こちらをご覧ください

于 2013-03-11T18:52:32.057 に答える
-1
MultipleOutputs.addNamedOutput(conf, "text", TextOutputFormat.class,
 LongWritable.class, Text.class);

これが出力ディレクトリまたは?textという名前の単一の大きなファイルです。text

于 2015-11-11T07:25:48.370 に答える