从 java 操作访问 Oozie 上下文
Access Oozie context from a java action
我有以下用例。在 oozie 工作流中,map-reduce 操作会生成一系列诊断计数器。我想在 map-reduce 操作之后进行另一个 java 操作。 java 操作基本上根据来自 map-reduce 操作的计数器进行验证,并根据验证条件和结果生成一些通知。这个想法起作用的关键是 java 操作必须能够访问上游 map-reduce 操作中的所有计数器,就像 oozie 如何使用 EL 在其工作流中访问它们一样 xml .
现在我不知道从哪里开始。因此,非常感谢任何指针。
更新
例如,假设我有一个名为 foomr
的 map-reduce 操作。在 oozie 工作流 xml 中,您可以使用 EL 访问计数器,例如 ${hadoop:counters("foomr")[RECORDS][MAP_IN]}
。那么,我的问题是,如何在 java 操作中获得相同的计数器? oozie 是否公开任何 API 以访问 EL 在工作流中可访问的值 xml?
您可以使用捕获输出标签来捕获 java 操作的输出。这些 java 属性格式的输出可以在 oozie 节点中传播。
捕获输出元素可用于将值传播回 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.
我在 oozie 文档的“工作流程参数化”部分下看到了以下行:
EL表达式可用于action和decision节点的配置值。它们可用于 XML 属性值以及 XML 元素和属性值。
它们不能用于 XML 元素和属性名称。它们不能用在节点的名称中,也不能用在节点的过渡元素中。
我认为 oozie 没有在操作节点中公开工作流操作数据。我们可以将其作为参数从外部传递给 java 操作。
如果要访问 hadoop 计数器,那么我认为您应该检查 YARN 或 jobtracker 是否公开任何 Web 服务 API,您可以在其中传递作业名称并获取相应的计数器作为输出。
我有以下用例。在 oozie 工作流中,map-reduce 操作会生成一系列诊断计数器。我想在 map-reduce 操作之后进行另一个 java 操作。 java 操作基本上根据来自 map-reduce 操作的计数器进行验证,并根据验证条件和结果生成一些通知。这个想法起作用的关键是 java 操作必须能够访问上游 map-reduce 操作中的所有计数器,就像 oozie 如何使用 EL 在其工作流中访问它们一样 xml .
现在我不知道从哪里开始。因此,非常感谢任何指针。
更新
例如,假设我有一个名为 foomr
的 map-reduce 操作。在 oozie 工作流 xml 中,您可以使用 EL 访问计数器,例如 ${hadoop:counters("foomr")[RECORDS][MAP_IN]}
。那么,我的问题是,如何在 java 操作中获得相同的计数器? oozie 是否公开任何 API 以访问 EL 在工作流中可访问的值 xml?
您可以使用捕获输出标签来捕获 java 操作的输出。这些 java 属性格式的输出可以在 oozie 节点中传播。
捕获输出元素可用于将值传播回 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.
我在 oozie 文档的“工作流程参数化”部分下看到了以下行:
EL表达式可用于action和decision节点的配置值。它们可用于 XML 属性值以及 XML 元素和属性值。 它们不能用于 XML 元素和属性名称。它们不能用在节点的名称中,也不能用在节点的过渡元素中。
我认为 oozie 没有在操作节点中公开工作流操作数据。我们可以将其作为参数从外部传递给 java 操作。
如果要访问 hadoop 计数器,那么我认为您应该检查 YARN 或 jobtracker 是否公开任何 Web 服务 API,您可以在其中传递作业名称并获取相应的计数器作为输出。