我有以下用例。在oozie工作流程中,map-reduce操作会生成一系列诊断计数器。我希望在map-reduce操作之后有另一个java动作。 java动作基本上根据map-reduce动作中的计数器进行验证,并根据验证条件和结果生成一些通知。这个想法的关键是java动作必须能够访问上游map-reduce动作中的所有计数器,就像oozie可以使用EL在其工作流xml中访问它们一样。
现在我不知道从哪里开始。所以,非常感谢任何指针。
更新
例如,假设我有一个名为foomr
的map-reduce操作。在oozie workflow xml中,您可以使用EL访问计数器,例如${hadoop:counters("foomr")[RECORDS][MAP_IN]}
。然后,我的问题是,如何在java动作中获得相同的计数器? oozie是否公开任何API来访问EL可以访问的值,如工作流xml?
答案 0 :(得分:1)
您可以使用捕获输出标记来捕获java操作的输出。 java属性格式的这些输出可以在oozie节点中传播。
capture-output元素可用于将值传播回Oozie上下文,然后可以通过EL函数访问它。这需要写成java属性格式文件。(来自oozie的文档页面)。
请参阅下面的示例,了解如何在pig脚本中使用EL常量。请参阅下面可以使用的HDFS EL常数。
Hadoop EL Constants
RECORDS: Hadoop record counters group name.
MAP_IN: Hadoop mapper input records counter name.
MAP_OUT: Hadoop mapper output records counter name.
REDUCE_IN: Hadoop reducer input records counter name.
REDUCE_OUT: Hadoop reducer input record counter name.
GROUPS: 1024 * Hadoop mapper/reducer record groups counter name.
使用EL常量 user 的示例,用于动态计算路径。以类似的方式,您可以在工作流程中使用上述HDFS EL常量或用户定义的常量。
<pig>
<job-tracker>${jobTracker}</job-tracker>
<name-node>${nameNode}</name-node>
<prepare>
<delete path="${nameNode}/user/${wf:user()}/${examplesRoot}/output-data/pig"/>
</prepare>
<configuration>
<property>
<name>mapred.job.queue.name</name>
<value>${queueName}</value>
</property>
</configuration>
<script>id.pig</script>
<param>INPUT=/user/${wf:user()}/${examplesRoot}/input-data/text</param>
<param>OUTPUT=/user/${wf:user()}/${examplesRoot}/output-data/pig</param>
</pig>
编辑:
您还可以使用oozie java api,它将为actionName提供wf_actionData。
org.apache.oozie.DagELFunctions.wf_actionData(String actionName).
Return the action data for an action.
Parameters: actionName action name.
Returns: value of the property.
答案 1 :(得分:0)
我在工作流参数化部分的oozie文档中看到了以下行:
EL表达式可用于操作和决策节点的配置值。它们可用于XML属性值以及XML元素和属性值。 它们不能用于XML元素和属性名称。它们不能在节点名称中使用,也不能在节点的过渡元素中使用。
我认为oozie不会在动作节点中公开工作流动作数据。我们可以将它作为参数从外部传递给java动作。
如果要访问hadoop计数器,那么我认为您应该检查YARN或jobtracker是否公开任何Web服务API,您可以在其中传递作业名并获得相应的计数器作为输出。