我在Oozie中使用Hue在YARN上运行Sqoop作业时遇到了问题。我想从Oracle数据库下载表,并将该表上传到HDFS。我有一个由4个节点组成的多节点集群。
我想运行简单的Sqoop语句:
import --options-file /tmp/oracle_dos.txt --table BD.BD_TABLE --target-dir /user/user1/files/user_temp_20160930_30 --m 1
Options文件位于节点1的本地系统上。其他节点的/tmp/dir目录下没有options文件。我用Sqoop job创建了Oozie工作流,并试图运行它,但是我得到了错误:
3432 [main] ERROR org.apache.sqoop.Sqoop - Error while expanding arguments
java.lang.Exception: Unable to read options file: /tmp/oracle_dos.txt
最奇怪的是,这项工作有时还行,但有时却失败了。日志文件给了我答案——Oozie在YARN上运行Sqoop作业。
资源管理器(YARN的组件)决定哪个节点将执行Sqoop作业。当资源管理器决定节点1(它在本地文件系统上有选项文件)应该执行作业时,一切正常。但是当RM决定其他3个节点中的一个应该执行Sqoop作业时,它失败了。
这对我来说是个大问题,因为我不想在每个节点上上传选项文件(因为如果我有1000个节点怎么办?)。所以我的问题是-有没有办法告诉资源管理器应该使用哪个节点?
你可以在一个节点上为你的oozie动作创建一个自定义文件,这可以通过在你的sqoop动作中使用<file>
标签来完成,看看这个语法:
<workflow-app name="[WF-DEF-NAME]" xmlns="uri:oozie:workflow:0.1">
...
<action name="[NODE-NAME]">
<sqoop xmlns="uri:oozie:sqoop-action:0.2">
<job-tracker>[JOB-TRACKER]</job-tracker>
<name-node>[NAME-NODE]</name-node>
<prepare>
<delete path="[PATH]"/>
...
<mkdir path="[PATH]"/>
...
</prepare>
<configuration>
<property>
<name>[PROPERTY-NAME]</name>
<value>[PROPERTY-VALUE]</value>
</property>
...
</configuration>
<command>[SQOOP-COMMAND]</command>
<arg>[SQOOP-ARGUMENT]</arg>
...
<file>[FILE-PATH]</file>
...
<archive>[FILE-PATH]</archive>
...
</sqoop>
<ok to="[NODE-NAME]"/>
<error to="[NODE-NAME]"/>
</action>
...
</workflow-app>
还要读这个:
使文件、存档元素可用,以map-reduce作业、文件和档案。如果指定的路径是相对的,则假定为文件或归档器位于应用程序目录中相应的sub-path。如果路径是绝对的,则文件或存档它在给定的绝对路径中被期望。
用file元素指定的文件将是任务的主目录。
…
最简单的例子是把oracle_dos.txt
文件放到工作流目录,在工作流。xml中添加oracle_dos。txt元素然后把命令改成这样:
import --options-file ./oracle_dos.txt --table BD.BD_TABLE --target-dir /user/user1/files/user_temp_20160930_30 --m 1
在这种情况下,你的sqoop操作是在集群中随机选择的节点上运行的,oozie会将oracle_dos.txt
复制到这个节点上,你可以把它作为本地文件引用。
也许这与文件权限有关。试着把这个文件放到/home/{user}。