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
标记中引用的文件中定义一些全局属性。
经过长时间的斗争并阅读了许多文章,我仍然无法使其工作。 我怀疑一些简单的事情是错误的,因为我发现有文章表明此功能可以正常工作。
希望你能给我一个提示。
简而言之:
-
我有属性,
dbserver
、dbuser
和 dbpassword
在/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 模式规范清楚地显示了<global>
元素
Sqoop action Extension
没有提及全局参数 有自己的 XML 架构规范,它按照自己的节奏发展,并且与工作流架构不同步换句话说:就 Oozie 服务器而言,Sqoop 操作是一个插件。它不支持 100% 的“较新”功能,包括工作流模式 V0.4 中引入的 <global>
事物
2.你不明白properties和parameters之间的区别——我不怪你, Oozie 文档令人困惑和困惑。
参数 由 Oozie 用于在属性、命令等中运行 文本替换。您将它们的值定义为 文字,在提交时使用-config
参数,或在工作流级别的<parameters>
元素中。 “文字”是指您不能在另一个参数中引用一个参数。该值只是不可变的文本,按原样使用。
属性是 传递给 Oozie 启动的作业的 Java 属性。您可以在提交时使用-config
参数设置它们--是的,这是一团糟,Oozie 解析器必须找出哪些参数具有众所周知的属性名称,哪些只是参数-- 或 <global>
工作流元素 -- 但它们不会在所有“扩展”中传播,因为您已经发现了困难的方式 -- 或 <property>
操作元素或在 XML 文件中使用 <job-xml>
元素定义,在全局工作流级别或本地操作级别。
需要注意的两点:
当 properties 使用多个(冲突的)值多次定义时,必须有一个优先规则,但我不太确定 在 Oozie 中显式定义的 properties 可以使用 parameters 和 EL 函数动态定义其值;但是在<job-xml>
文件中定义的 属性 必须是文字,因为 Oozie 无法访问它们(它只是在运行时将文件内容传递给 Hadoop Configuration
构造函数)
这对你意味着什么?好吧,您的脚本告诉 Oozie 在运行时通过 <job-xml>
将“隐藏”属性传递给运行 Sqoop 作业的 JVM。
但是您希望 Oozie 解析 参数列表 并在编译时使用它们来定义一些 属性。那不会发生。
【讨论】:
嗨 Samson,非常感谢您的精彩解释 :) 现在我和顺便说一句更清楚了。您的解释应该在 Oozie 文档中 - 只是为了节省其他人的时间:) @ArB - 实际上,它的解释仍然不完整 - 在提交时传递的“属性”实际上是 Oozie 服务器 使用而不是用户使用的 Java 属性- 定义的动作;更一般地说,以oozie.
为前缀的 props 由服务器和/或 Oozie 库使用,这些库在 YARN 容器中引导作业执行。以上是关于OOZIE:在 global job-xml 中引用的文件中定义的属性在 workflow.xml 中不可见的主要内容,如果未能解决你的问题,请参考以下文章
如何将多个选项传递给 Firefox 中引导轮播的可选选项对象?