我正在使用新的Hadoop API编写一系列map-reduce作业。我计划使用Oozie将所有这些流水线化在一起,但似乎找不到从工作流中的map-reduce节点进行多个输出流的方法。

通常,要编写多个输出,我将使用类似于MultipleOutputs javadoc中给出的代码的代码,但是oozie从workflow.xml文件中获取了所有配置,因此无法像示例中那样配置命名的输出。

我遇到了一个thread,讨论了Oozie中多个输出的用法,但是除了创建Java任务并将其直接添加到Oozie管线之外,没有其他解决方案。

是否可以通过map-reduce中的workflow.xml节点实现此目的?

编辑:

克里斯的解决方案确实有效,尽管我希望有更好的方法。这是我所做的确切更改。

我在工作流.xml文件中添加了以下内容:

<property>
    <name>mapreduce.multipleoutputs</name>
   <value>${output1} ${output2}</value>
</property>
<property>
    <name>mapreduce.multipleoutputs.namedOutput.${output1}.key</name>
   <value>org.apache.hadoop.io.Text</value>
</property>
<property>
    <name>mapreduce.multipleoutputs.namedOutput.${output1}.value</name>
   <value>org.apache.hadoop.io.LongWritable</value>
</property>
<property>
    <name>mapreduce.multipleoutputs.namedOutput.${output1}.format</name>
   <value>org.apache.hadoop.mapreduce.lib.output.TextOutputFormat</value>
</property>
<property>
    <name>mapreduce.multipleoutputs.namedOutput.${output2}.key</name>
   <value>org.apache.hadoop.io.Text</value>
</property>
<property>
    <name>mapreduce.multipleoutputs.namedOutput.${output2}.value</name>
   <value>org.apache.hadoop.io.LongWritable</value>
</property>
<property>
    <name>mapreduce.multipleoutputs.namedOutput.${output2}.format</name>
   <value>org.apache.hadoop.mapreduce.lib.output.TextOutputFormat</value>
</property>

我在启动时提供给oozie的job.properties文件中添加了以下内容:
output1=totals
output2=uniques

然后,在 reducer 中,我写入命名输出totalsuniques

最佳答案

MultipleOutputs的addNamedOutput实用程序方法只是配置配置属性-因此,请查看已运行的作业实例并提取MultipleOutputs的属性(在job.xml中查找,位于JobTracker页面中)。

或者,在源代码中查找MultipleOutputs,并查看在调用此方法时正在设置的配置属性。

知道要设置的属性后,将它们添加到Oozie工作流程中map-reduce元素的配置部分。

07-24 09:39
查看更多