使用Oozie在YARN上运行Sqoop作业

时间:2016-10-12 15:11:46

标签: yarn sqoop oozie hue

我在使用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个节点怎么办?)。所以我的问题是 - 有没有办法告诉资源管理器它应该使用哪个节点?

2 个答案:

答案 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}。