我在使用Hue在Oozie的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
选项文件位于节点编号1的本地系统上。其他节点在/ tmp / dir中没有选项文件。我用Sqoop作业创建了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个节点怎么办?)。所以我的问题是 - 有没有办法告诉资源管理器它应该使用哪个节点?
答案 0 :(得分:1)
您可以在节点上为自己的oozie操作创建自定义文件,可以在sqoop操作中使用<file>
标记来完成,请查看此syntax:
<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>
另请阅读this:
文件,存档元素可用于映射减少作业,文件 和档案。如果指定的路径是相对的,则假定为 文件或归档文件位于应用程序目录中 相应的子路径。如果路径是绝对路径,则为文件或存档 预计在给定的绝对路径中。
使用file元素指定的文件将是。中的符号链接 任务的主目录。
...
因此,在最简单的情况下,您将文件oracle_dos.txt
放在工作流目录中,在workflow.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
复制到此节点,您可以将其称为本地文件。
答案 1 :(得分:0)
也许这与文件权限有关。尝试将此文件放在/ home / {user}。