正如@JudgeMental 指出的,你应该使用MultipleOutputs
使用新的 API (mapreduce
) 因为MultipleOutputFormat
只支持旧的API(mapred
). MultipleOutputs
实际上为您提供的功能比MultipleOutputFormat
:
- With
MultipleOutputs
,每个输出可以有自己的OutputFormat
,而与MultipleOutputFormat
每个输出必须相同OutputFormat
.
- With
MultipleOutputFormat
您对命名方案和输出目录结构有更多的控制权MultipleOutputs
.
- 您可以使用
MultipleOutputs
in the map
and reduce
在同一份工作中发挥职能,这是你无法做到的MultipleOutputFormat
.
- 您可以为不同的输出设置不同的键和值类型
MultipleOutputs
.
所以两者并不相互排斥,即使MultipleOutputs
功能较多,但命名功能不太灵活。
了解如何使用MultipleOutputs
,你应该看看本文档 http://hadoop.apache.org/docs/current/api/org/apache/hadoop/mapreduce/lib/output/MultipleOutputs.html其中包含一个完整的示例。简而言之,您将在驱动程序类中添加以下内容:
// 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
or Reducer
你应该初始化你的MultipleOutputs
in the setup
方法与MultipleOutputs mos = new MultipleOutputs(context);
然后你可以在map
and reduce
功能为mos.write("seq", LongWritable(1), new Text("Bye"), "seq_a")
。不要忘记将其关闭cleanup
方法与mos.close()
!