我是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>
答案 0 :(得分:6)
好的,你犯了两大错误。
1。让我们从Oozie文档(V4.2)的某些部分快速解释开始
Workflow Functional Specification
<global>
元素换句话说:就Oozie服务器而言, Sqoop操作是一个插件。它不支持100%的“更新”功能,包括工作流模式V0.4中引入的<global>
功能
2。您不理解属性和参数之间的区别 - 我不怪你,Oozie文档很混乱,混乱。
参数由Oozie 使用在属性,命令等中运行文本替换。您可以将其值定义为文字,在提交时使用-config
参数,或在工作流级别的<parameters>
元素中。而“文字”我的意思是你不能在另一个参数中引用参数。该值只是不可变的文本,按原样使用。
属性是传递给Oozie启动的作业的Java属性。您可以在提交时使用-config
参数设置它们 - 是的,它是一团糟,Oozie解析器必须解决哪些参数具有一个众所周知的属性名称以及哪些只是参数 - - 或<global>
工作流元素 - 但它们不会在所有“扩展程序”中传播,因为您已经发现了困难的方法 - 或{{ 1}}使用<property>
元素定义的操作元素或在XML文件中,可以是全局工作流级别,也可以是本地操作级别。
有两点需要注意:
<job-xml>
文件中定义的属性必须是文字,因为Oozie无权访问它们(它只是在运行时将文件内容传递给Hadoop <job-xml>
构造函数)< / LI>
这对你意味着什么?好吧,你的脚本告诉Oozie在运行时通过Configuration
将“隐藏的”属性传递给运行Sqoop作业的JVM。
但是你期待Oozie解析一个参数列表并在编译时使用它们来定义一些属性。这不会发生。