OOZIE:在全局作业中引用的文件中定义的属性 - xml 在 workflow.xml 中不可见
OOZIE: properties defined in file referenced in global job-xml not visible in workflow.xml
我是 hadoop 的新手,现在我正在测试仅使用单个 sqoop 操作的简单工作流。如果我使用纯值而不是全局属性,它会起作用。
然而,我的 objective 是在全局部分的 job-xml
标记引用的文件中定义一些全局属性。
折腾了很久,看了很多文章还是不行。
我怀疑一些简单的事情是错误的,因为我发现文章表明此功能工作正常。
希望你能给我一个提示。
简而言之:
- 我在
/user/dm/conf/environment.xml
中定义了属性 dbserver
、dbuser
和 dbpassword
- 我的
/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
我的工作-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>
元素
- 没有提及全局参数
- 有自己的 XML 模式规范,它按照自己的节奏发展,并且不是最新的工作流模式
换句话说:就Oozie服务器而言,Sqoop动作是一个插件。它不支持 100% 的 "newer" 功能,包括在 Workflow 架构 V0.4
中引入的 <global>
功能
2. 你不明白 properties 和 parameters 之间的区别——我也不明白怪你,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 解析 参数列表 并在编译时使用它们来定义一些 属性 。那不会发生。
我是 hadoop 的新手,现在我正在测试仅使用单个 sqoop 操作的简单工作流。如果我使用纯值而不是全局属性,它会起作用。
然而,我的 objective 是在全局部分的 job-xml
标记引用的文件中定义一些全局属性。
折腾了很久,看了很多文章还是不行。 我怀疑一些简单的事情是错误的,因为我发现文章表明此功能工作正常。
希望你能给我一个提示。
简而言之:
- 我在
/user/dm/conf/environment.xml
中定义了属性 - 我的
/user/dm/jobs/sqoop-test/workflow.xml
中引用了这些属性
- 在运行时,我收到一个
EL_ERROR
说无法解析dbserver
变量
dbserver
、dbuser
和 dbpassword
详情如下:
我正在使用安装在单个节点上的 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>
元素
- 没有提及全局参数
- 有自己的 XML 模式规范,它按照自己的节奏发展,并且不是最新的工作流模式
换句话说:就Oozie服务器而言,Sqoop动作是一个插件。它不支持 100% 的 "newer" 功能,包括在 Workflow 架构 V0.4
中引入的<global>
功能
2. 你不明白 properties 和 parameters 之间的区别——我也不明白怪你,Oozie 文档令人困惑。
参数被Oozie用于运行属性中的文本替换 ,在命令等中。您将它们的值定义为 文字 ,或者在提交时使用 -config
参数,或者在工作流级别的 <parameters>
元素中。 "literal" 我的意思是您不能在另一个参数中引用一个参数。该值只是不可变的文本,按原样使用。
属性 是 Java 传递给 Oozie 启动的作业 的属性。您可以在提交时使用 -config
参数 来设置它们——是的,这是一团糟,Oozie 解析器必须找出哪些参数具有众所周知的 属性 名称,并且哪些只是参数 -- 或 <global>
工作流元素 -- 但它们不会在所有 "extensions" 中传播,因为您已经发现了困难的方法-- 或在 <property>
操作元素中或 在使用 <job-xml>
元素定义的 XML 文件 中,或者在全局工作流级别或在当地行动层面。
需要注意两点:
- 当 properties 被多次定义为多个(冲突的)值时,必须有一个优先规则,但我不太确定
- properties 在 Oozie 中显式定义,可以使用 parameters 和 EL 函数动态定义它们的值;但是
<job-xml>
文件中定义的 properties 必须是文字,因为 Oozie 无法访问它们(它只是将文件内容传递给 HadoopConfiguration
构造函数 运行-次)
这对你意味着什么?好吧,您的脚本告诉 Oozie 在 运行 时间通过 <job-xml>
.
但是您期望 Oozie 解析 参数列表 并在编译时使用它们来定义一些 属性 。那不会发生。