在hadoop中,多个reducer如何只输出一个部件文件?

svmlkihl  于 2021-06-03  发布在  Hadoop
关注(0)|答案(2)|浏览(354)

在map reduce作业中,我使用4个reducer来实现reducer作业。因此,通过这样做,最终输出将生成4个零件文件。:part-0000 part-0001 part-0002 part-0003
我的问题是如何设置hadoop的配置以只输出一个部件文件,尽管hadoop使用4个reducer来工作?

tmb3ates

tmb3ates1#

这不是hadoop所期望的行为。但你可以用 MultipleOutputs 对你有利。创建一个命名的输出,并在所有的reducer中使用它来获得一个文件本身的最终输出。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 然后看这里。

ohtdti5x

ohtdti5x2#

MultipleOutputs.addNamedOutput(conf, "text", TextOutputFormat.class,
 LongWritable.class, Text.class);

在这里 text 输出目录或单个大文件名为 text ?

相关问题