5

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

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

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

有没有办法通过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>

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

output1=totals
output2=uniques

然后在减速器中,我写入了命名的输出totalsuniques.

4

2 回答 2

3

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

或者,查看 MultipleOutputs 的源代码,查看调用此方法时设置了哪些配置属性。

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

于 2012-03-21T17:49:49.450 回答
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 上测试和验证

于 2014-05-15T19:21:18.360 回答