使用org.apache.hadoop.mapreduce.Job的Hadoop MultipleOutputFormat支持

时间:2013-11-26 05:16:12

标签: hadoop

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

1 个答案:

答案 0 :(得分:1)

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

  • 使用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);,然后您可以在map中使用它{1}}和reduce的功能为mos.write("seq", LongWritable(1), new Text("Bye"), "seq_a")。不要忘记使用cleanup!{/ p>在mos.close()方法中关闭它