从java动作访问Oozie上下文

时间:2015-07-26 16:49:49

标签: java hadoop oozie

我有以下用例。在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?

2 个答案:

答案 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 docs

我认为oozie不会在动作节点中公开工作流动作数据。我们可以将它作为参数从外部传递给java动作。

如果要访问hadoop计数器,那么我认为您应该检查YARN或jobtracker是否公开任何Web服务API,您可以在其中传递作业名并获得相应的计数器作为输出。