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

时间:2016-07-12 19:26:33

标签: hadoop sqoop oozie

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

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

经过长时间的斗争和阅读许多文章后,我仍然无法使其发挥作用。 我怀疑一些简单的事情是错误的,因为我发现文章暗示这个功能正常。

希望你能给我一个提示。

简而言之:

  1. 我有dbserver
  2. 中定义的属性dbuserdbpassword/user/dm/conf/environment.xml
  3. 我的/user/dm/jobs/sqoop-test/workflow.xml
  4. 中引用了这些属性
  5. 在运行时,我收到一条EL_ERROR,说dbserver变量无法解析
  6. 以下是详细信息:

    我正在使用安装在单个节点上的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 个答案:

答案 0 :(得分:6)

好的,你犯了两大错误。

1。让我们从Oozie文档(V4.2)的某些部分快速解释开始

Workflow Functional Specification

  • 有关于全局配置的第19节
  • 有关于核心动作类型的第3.2.x节,即MapReduce,Pig,Java等。
  • XML架构规范清楚地显示了<global>元素

Sqoop action Extension

  • 未提及全局参数
  • 有自己的XML架构规范,它按照自己的进度发展,并且不与工作流架构保持同步

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


2。您不理解属性参数之间的区别 - 我不怪你,Oozie文档很混乱,混乱。

参数由Oozie 使用在属性,命令等中运行文本替换。您可以将其值定义为文字,在提交时使用-config参数,或在工作流级别的<parameters>元素中。而“文字”我的意思是你不能在另一个参数中引用参数。该值只是不可变的文本,按原样使用。

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

有两点需要注意:

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

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