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



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

通常,要编写多个输出,我会使用与MultipleOutputs javadoc中给出的代码类似的代码,但oozie的所有配置都来自workflow.xml文件,因此无法像示例中那样配置命名输出。

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

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

编辑:

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

我在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>

我在启动时向oozie提供的job.properties文件中添加了以下内容:

output1=totals
output2=uniques

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

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

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

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

从Hadoop2.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 上测试和验证

相关内容

  • 没有找到相关文章

最新更新