OOZIE:在全局作业中引用的文件中定义的属性 - xml 在 workflow.xml 中不可见

OOZIE: properties defined in file referenced in global job-xml not visible in workflow.xml

我是 hadoop 的新手,现在我正在测试仅使用单个 sqoop 操作的简单工作流。如果我使用纯值而不是全局属性,它会起作用。

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

折腾了很久,看了很多文章还是不行。 我怀疑一些简单的事情是错误的,因为我发现文章表明此功能工作正常。

希望你能给我一个提示。

简而言之:

  1. 我在 /user/dm/conf/environment.xml
  2. 中定义了属性 dbserverdbuserdbpassword
  3. 我的 /user/dm/jobs/sqoop-test/workflow.xml
  4. 中引用了这些属性
  5. 在运行时,我收到一个 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

我的工作-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. 让我们从快速解读 Oozie 文档 (V4.2) 的某些部分开始

Workflow Functional Specification

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

Sqoop action Extension

  • 没有提及全局参数
  • 有自己的 XML 模式规范,它按照自己的节奏发展,并且不是最新的工作流模式

换句话说:就Oozie服务器而言,Sqoop动作是一个插件。它不支持 100% 的 "newer" 功能,包括在 Workflow 架构 V0.4

中引入的 <global> 功能


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

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

属性Java 传递给 Oozie 启动的作业 的属性。您可以在提交时使用 -config 参数 来设置它们——是的,这是一团糟,Oozie 解析器必须找出哪些参数具有众所周知的 属性 名称,并且哪些只是参数 --<global> 工作流元素 -- 但它们不会在所有 "extensions" 中传播,因为您已经发现了困难的方法-- 或在 <property> 操作元素中或 在使用 <job-xml> 元素定义的 XML 文件 中,或者在全局工作流级别或在当地行动层面。

需要注意两点:

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

这对你意味着什么?好吧,您的脚本告诉 Oozie 在 运行 时间通过 <job-xml>.
但是您期望 Oozie 解析 参数列表 并在编译时使用它们来定义一些 属性 。那不会发生。