私のmap-reduceジョブでは、4つのレデューサーを使用してレデューサージョブを実装しています。したがって、これを行うことにより、最終出力は4つのパーツファイルを生成します。:part-0000 part-0001 part-0002 part-0003
私の質問は、hadoopが4つのレデューサーを使用して機能するにもかかわらず、hadoopの構成を1つのパーツファイルのみを出力するように設定するにはどうすればよいですか?
私のmap-reduceジョブでは、4つのレデューサーを使用してレデューサージョブを実装しています。したがって、これを行うことにより、最終出力は4つのパーツファイルを生成します。:part-0000 part-0001 part-0002 part-0003
私の質問は、hadoopが4つのレデューサーを使用して機能するにもかかわらず、hadoopの構成を1つのパーツファイルのみを出力するように設定するにはどうすればよいですか?
これは、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を使用している場合は、こちらをご覧ください。
MultipleOutputs.addNamedOutput(conf, "text", TextOutputFormat.class,
LongWritable.class, Text.class);
これが出力ディレクトリまたは?text
という名前の単一の大きなファイルです。text