使用oozie为mapreduce作业写入多个输出流的正确方法是什么?

时间:2012-03-21 17:27:05

标签: java hadoop mapreduce oozie

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

通常要编写多个输出,我会使用与MultipleOutputs javadoc中给出的代码类似的代码,但是oozie从workflow.xml文件中获取所有配置,因此命名输出不能像它们在示例

我遇到过thread讨论在Oozie中使用多个输出的问题,但是除了创建Java任务并将其直接添加到Oozie pipline之外,没有提出任何解决方案。

有没有办法通过map-reduce中的workflow.xml节点?

编辑:

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

我将以下内容添加到workflow.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>

我将以下内容添加到job.properties文件中,该文件在启动时被提供给oozie:

output1=totals
output2=uniques

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

2 个答案:

答案 0 :(得分:3)

MultipleOutputs的addNamedOutput实用程序方法只是配置配置属性 - 所以请查看已运行的作业实例并提取MultipleOutputs的属性(查看job.xml,从JobTracker页面排列)。

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

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

答案 1 :(得分:3)

从Hadoop 2.x开始,属性名称已从mapreduce.multipleoutputs。*更改为mo。*,因此新配置属性现在将如下所示:

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

在Hadoop 2.4.x,Ooize 4.0.0上进行了测试和验证