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

ArB*_*ArB 3 hadoop sqoop oozie

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

但是,我的目标是job-xml在全局部分的tag中引用的文件中定义一些全局属性.

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

希望你能给我一个提示.

简而言之:

  1. 我有属性dbserver,dbuserdbpassword在中定义/user/dm/conf/environment.xml
  2. 这些属性在我的引用 /user/dm/jobs/sqoop-test/workflow.xml
  3. 在运行时,我收到一个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>
Run Code Online (Sandbox Code Playgroud)

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>
Run Code Online (Sandbox Code Playgroud)

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

sudo -u dm oozie job --oozie http://host:11000/oozie -config job-config.xml -run
Run Code Online (Sandbox Code Playgroud)

我的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>
Run Code Online (Sandbox Code Playgroud)

Sam*_*ter 6

好的,你犯了两大错误.

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

工作流功能规范

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

Sqoop行动扩展

  • 没有提到全局参数
  • 有自己的XML模式规范,它按照自己的进度发展,并且不与Workflow模式保持同步

换句话说:就Oozie服务器而言,Sqoop操作是一个插件.它不支持100%的"更新"功能,包括<global>Workflow架构V0.4中引入的功能


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

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

属性传递给 Oozie启动的作业的Java属性.您可以在提交时使用-config参数设置它们- 是的,它是一团糟,Oozie解析器必须解决哪些参数具有已知属性名称以及哪些只是参数 -或者在<global>工作流元素中-但它们不会在所有"扩展"中传播,因为您已经发现了困难的方法 -或者在<property>Action元素中或使用<job-xml>element 定义的XML文件内部,无论是在全局工作流级别还是在本地Action级别.

有两点需要注意:

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

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