我是Hadoop的新手!
现在,我正在尝试将MultipleOutputFormat与hadoop 2.2.0一起使用,但似乎它们仅与已弃用的“JobConf”一起使用,而后者又使用了已弃用的Mapper和Reducer(org.apache.hadoop.mapred.Reducer)等。有什么想法如何使用新的'org.apache.hadoop.mapreduce.Job'实现多个输出功能吗?

最佳答案

正如@JudgeMental指出的那样,您应该将MultipleOutputs与新的API(mapreduce)一起使用,因为MultipleOutputFormat仅支持旧的API(mapred)。实际上,MultipleOutputsMultipleOutputFormat提供了更多功能:

  • 使用MultipleOutputs,每个输出可以具有自己的OutputFormat,而使用MultipleOutputFormat,每个输出必须具有相同的OutputFormat
  • MultipleOutputFormat相比,有了MultipleOutputs,您可以更好地控制命名方案和输出目录结构。
  • 您可以在同一作业中的MultipleOutputsmap函数中使用reduce,而MultipleOutputFormat则无法做到这一点。
  • 您可以使用MultipleOutputs为不同的输出提供不同的键和值类型。

  • 因此,尽管MultipleOutputs具有更多功能,但它们重新命名功能的灵活性较差,因此两者并不互相排斥。

    要学习如何使用MultipleOutputs,您应该看一下this documentation,其中包含一个完整的示例。简而言之,这是您要放入驱动程序类的内容:
    // Defines additional single text based output 'text' for the job
    MultipleOutputs.addNamedOutput(job, "text", TextOutputFormat.class, LongWritable.class, Text.class);
    
    // Defines additional sequence-file based output 'sequence' for the job
    MultipleOutputs.addNamedOutput(job, "seq", SequenceFileOutputFormat.class, LongWritable.class, Text.class);
    

    MapperReducer中,您只需使用MultipleOutputssetup方法中初始化MultipleOutputs mos = new MultipleOutputs(context);,然后就可以将其作为mapreducemos.write("seq", LongWritable(1), new Text("Bye"), "seq_a")函数中使用。不要忘记使用cleanupmos.close()方法中将其关闭!

    07-24 15:37