OOZIE:在 global job-xml 中引用的文件中定义的属性在 workflow.xml 中不可见

Posted

技术标签:

【中文标题】OOZIE:在 global job-xml 中引用的文件中定义的属性在 workflow.xml 中不可见【英文标题】:OOZIE: properties defined in file referenced in global job-xml not visible in workflow.xml 【发布时间】:2016-07-12 19:26:32 【问题描述】:

我是 hadoop 新手,现在我正在测试简单的工作流程,只需要一个 sqoop 操作。如果我使用普通值而不是全局属性,它就可以工作。

然而,我的目标是在全局部分的job-xml 标记中引用的文件中定义一些全局属性。

经过长时间的斗争并阅读了许多文章,我仍然无法使其工作。 我怀疑一些简单的事情是错误的,因为我发现有文章表明此功能可以正常工作。

希望你能给我一个提示。

简而言之:

    我有属性,dbserverdbuserdbpassword/user/dm/conf/environment.xml 中定义 我的/user/dm/jobs/sqoop-test/workflow.xml中引用了这些属性 在运行时,我收到 EL_ERROR 说无法解析 dbserver 变量

以下是详细信息:

我正在使用安装在单个节点上的 Cloudera 5.7.1 发行版。

environment.xml 文件已上传到 hdfs 到 /user/dm/conf 文件夹。 内容如下:

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
            <property>
               <name>dbserver</name>
               <value>someserver</value>
            </property>
            <property>
               <name>dbuser</name>
               <value>someuser</value>
            </property>
            <property>
               <name>dbpassword</name>
               <value>somepassword</value>
            </property>    
</configuration>

workflow.xml 文件已上传到/user/dm/jobs/sqoop-test-job。内容如下:

<?xml version="1.0" encoding="UTF-8"?>
<workflow-app xmlns="uri:oozie:workflow:0.4" name="sqoop-test">
    <global>
        <job-xml>/user/dm/conf/env.xml</job-xml>
    </global>
    <start to="get-data"/>
    <action name="get-data">
        <sqoop xmlns="uri:oozie:sqoop-action:0.3">
            <job-tracker>$jobTracker</job-tracker>
            <name-node>$nameNode</name-node>       
            <prepare>
                <delete path="$outputRootPath"/>
            </prepare>
            <arg>import</arg>
            <arg>--connect</arg>
            <arg>jdbc:sqlserver://$dbserver;user=$dbuser;password=$dbpassword</arg>
            <arg>--query</arg>
            <arg>select col1 from table where $CONDITIONS</arg>
            <arg>--split-by</arg>
            <arg>main_id</arg>
            <arg>--target-dir</arg>
            <arg>$outputRootPath/table</arg>
            <arg>-m</arg>
            <arg>1</arg>
        </sqoop>
        <ok to="end"/>
        <error to="kill"/>
    </action>
    <kill name="kill">
        <message>Sqoop-test failed, error message[$wf:errorMessage()]</message>
    </kill>
    <end name='end'/>
</workflow-app>

现在,我从命令行执行 oozie 工作流:

sudo -u dm oozie job --oozie http://host:11000/oozie -config job-config.xml -run

我的job-config.xml在哪里如下:

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<configuration>
<property>
        <name>nameNode</name>
        <value>namenode:8020</value>
</property>
<property>
        <name>jobTracker</name>
        <value>jobtracker:8021</value>
</property>
<property>
        <name>oozie.wf.application.path</name>
        <value>/user/dm/jobs/sqoop-test-job/workflow.xml</value>
</property>
<property>
        <name>outputRootPath</name>
        <value>/user/dm/data/sqoop-test</value>
</property>
</configuration>

【问题讨论】:

【参考方案1】:

好吧,你犯了两个大错误。

1.让我们先快速解读一下 Oozie 文档 (V4.2) 的某些部分

Workflow Functional Specification

有一个关于全局配置的第 19 节 在 3.2.x 节中介绍了核心操作类型,即 MapReduce、Pig、Java 等。 XML 模式规范清楚地显示了&lt;global&gt; 元素

Sqoop action Extension

没有提及全局参数 有自己的 XML 架构规范,它按照自己的节奏发展,并且与工作流架构不同步

换句话说:就 Oozie 服务器而言,Sqoop 操作是一个插件。它不支持 100% 的“较新”功能,包括工作流模式 V0.4 中引入的 &lt;global&gt; 事物

2.你不明白propertiesparameters之间的区别——我不怪你, Oozie 文档令人困惑和困惑。

参数 由 Oozie 用于在属性、命令等中运行 文本替换。您将它们的值定义为 文字,在提交时使用-config 参数,或在工作流级别的&lt;parameters&gt; 元素中。 “文字”是指您不能在另一个参数中引用一个参数。该值只是不可变的文本,按原样使用。

属性传递给 Oozie 启动的作业的 Java 属性。您可以在提交时使用-config 参数设置它们--是的,这是一团糟,Oozie 解析器必须找出哪些参数具有众所周知的属性名称,哪些只是参数-- 或 &lt;global&gt; 工作流元素 -- 但它们不会在所有“扩展”中传播,因为您已经发现了困难的方式 --&lt;property&gt; 操作元素或在 XML 文件中使用 &lt;job-xml&gt; 元素定义,在全局工作流级别或本地操作级别。

需要注意的两点:

properties 使用多个(冲突的)值多次定义时,必须有一个优先规则,但我不太确定 在 Oozie 中显式定义的 properties 可以使用 parameters 和 EL 函数动态定义其值;但是在 &lt;job-xml&gt; 文件中定义的 属性 必须是文字,因为 Oozie 无法访问它们(它只是在运行时将文件内容传递给 Hadoop Configuration 构造函数)

这对你意味着什么?好吧,您的脚本告诉 Oozie 在运行时通过 &lt;job-xml&gt; 将“隐藏”属性传递给运行 Sqoop 作业的 JVM。 但是您希望 Oozie 解析 参数列表 并在编译时使用它们来定义一些 属性。那不会发生。

【讨论】:

嗨 Samson,非常感谢您的精彩解释 :) 现在我和顺便说一句更清楚了。您的解释应该在 Oozie 文档中 - 只是为了节省其他人的时间:) @ArB - 实际上,它的解释仍然不完整 - 在提交时传递的“属性”实际上是 Oozie 服务器 使用而不是用户使用的 Java 属性- 定义的动作;更一般地说,以 oozie. 为前缀的 props 由服务器和/或 Oozie 库使用,这些库在 YARN 容器中引导作业执行。

以上是关于OOZIE:在 global job-xml 中引用的文件中定义的属性在 workflow.xml 中不可见的主要内容,如果未能解决你的问题,请参考以下文章

如何将多个选项传递给 Firefox 中引导轮播的可选选项对象?

自动布局中引脚和对齐之间的区别?

在一个多模块的python项目中,如何在子模块中引用项目的根目录?

oozie日志查看 oozie日志过滤

Oozie框架介绍

大数据Hadoop之——任务调度器Oozie(Oozie环境部署)