我是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
)。实际上,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
在reduce
和mos.write("seq", LongWritable(1), new Text("Bye"), "seq_a")
函数中使用。不要忘记使用cleanup
在mos.close()
方法中将其关闭!