我是Hadoop的新手! 现在我尝试将MultipleOutputFormat与hadoop 2.2.0一起使用,但似乎它们只适用于已弃用的'JobConf',后者又使用了弃用的Mapper和Reducer(org.apache.hadoop.mapred.Reducer)等。任何想法如何使用新的'org.apache.hadoop.mapreduce.Job'来实现多个输出功能?
答案 0 :(得分:1)
正如@JudgeMental所说,您应该将MultipleOutputs
与新API(mapreduce
)一起使用,因为MultipleOutputFormat
仅支持旧API(mapred
)。 MultipleOutputs
实际上为您提供了比MultipleOutputFormat
更多的功能:
MultipleOutputs
,每个输出都可以有自己的OutputFormat
,而MultipleOutputFormat
每个输出必须是OutputFormat
。MultipleOutputFormat
,您可以更好地控制命名方案和输出目录结构,而不是MultipleOutputs
。MultipleOutputs
和map
函数中使用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);
在您的Mapper
或Reducer
中,您应该使用MultipleOutputs
在setup
方法中初始化MultipleOutputs mos = new MultipleOutputs(context);
,然后您可以在map
中使用它{1}}和reduce
的功能为mos.write("seq", LongWritable(1), new Text("Bye"), "seq_a")
。不要忘记使用cleanup
!{/ p>在mos.close()
方法中关闭它