ArB*_*ArB 3 hadoop sqoop oozie
我是hadoop的新手,现在我只用一个sqoop动作来测试简单的工作流程.如果我使用普通值 - 而不是全局属性,它可以工作.
但是,我的目标是job-xml在全局部分的tag中引用的文件中定义一些全局属性.
经过长时间的斗争和阅读许多文章,我仍然无法使其工作.我怀疑一些简单的事情是错误的,因为我发现文章暗示这个功能正常.
希望你能给我一个提示.
简而言之:
dbserver,dbuser并dbpassword在中定义/user/dm/conf/environment.xml/user/dm/jobs/sqoop-test/workflow.xmlEL_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)
好的,你犯了两大错误.
1.让我们从Oozie文档(V4.2)的某些部分快速解释开始
<global>元素换句话说:就Oozie服务器而言,Sqoop操作是一个插件.它不支持100%的"更新"功能,包括<global>Workflow架构V0.4中引入的功能
2.你不理解属性和参数之间的区别- 我不怪你,Oozie文档很混乱和混乱.
Oozie使用参数在属性,命令等中运行文本替换.您可以在提交时使用参数或在工作流级别的元素中将其值定义为文字.而"文字"我的意思是你不能在另一个参数中引用参数.该值只是不可变文本,按原样使用.-config<parameters>
属性是传递给 Oozie启动的作业的Java属性.您可以在提交时使用-config参数设置它们- 是的,它是一团糟,Oozie解析器必须解决哪些参数具有已知属性名称以及哪些只是参数 -或者在<global>工作流元素中-但它们不会在所有"扩展"中传播,因为您已经发现了困难的方法 -或者在<property>Action元素中或在使用<job-xml>element 定义的XML文件内部,无论是在全局工作流级别还是在本地Action级别.
有两点需要注意:
<job-xml>必须是文字,因为Oozie无权访问它们(它只是Configuration在运行时将文件内容传递给Hadoop 构造函数)这对你意味着什么?好吧,你的脚本告诉Oozie 在运行时通过a 将"隐藏" 属性传递给运行Sqoop作业的JVM <job-xml>.
但是你期望Oozie解析参数列表并在编译时使用它们来定义一些属性.这不会发生.