【问题标题】:Access Oozie context from a java action从 Java 操作访问 Oozie 上下文
【发布时间】:2015-07-26 16:49:48
【问题描述】:

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


    【解决方案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.
    

    【讨论】:

    • 谢谢你的回答,文卡塔。但是,我想我正在寻找相反的东西。即,我想在 java 操作中访问 EL 可访问的值,而不是将值从 java 操作传播到 EL 上下文。
    • 文卡塔,再次感谢。但是,我认为我不理解您的编辑。您是否建议我直接在 java 操作中使用 oozie java api?这是如何运作的?我的意思是,一个 java 操作作为一个映射器 MR 作业在单独的 JVM 中运行。 oozie 如何将其他操作的计数器传播到 java 操作 JVM?我想应该有一些 oozie 客户端 api 与 oozie 服务器对话以获取该信息。当然,我可能是错的。毕竟,我是来寻求答案的。
    • 是的..我同意你的看法
    【解决方案2】:

    我在 oozie 文档的“工作流参数化”部分下看到以下行:

    EL 表达式可用于动作和决策节点的配置值。它们可用于 XML 属性值以及 XML 元素和属性值。 它们不能用于 XML 元素和属性名称。它们不能用在节点的名称中,也不能用在节点的过渡元素中。

    oozie docs

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-09-17
      • 2016-09-23
      • 2019-08-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多