运行 YARN 上使用 Oozie 的 Sqoop 作业

Running Sqoop job on YARN using Oozie

我在使用 Hue 在 Oozie 的 YARN 上 运行ning Sqoop 作业时遇到问题。我想从 Oracle 数据库下载 table 并将 table 上传到 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/ 目录中没有选项文件。我使用 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 运行s Sqoop jobs on YARN。

资源管理器(YARN 的组件)决定哪个节点将执行 Sqoop 作业。当资源管理器决定节点 1(在本地文件系统上有选项文件)应该执行作业时,一切正常。但是当 RM 决定其他 3 个节点之一应该执行 Sqoop 作业时,它失败了。

这对我来说是个大问题,因为我不想在每个节点上上传选项文件(因为如果我有 1000 个节点怎么办?)。所以我的问题是 - 有什么方法可以告诉资源管理器它应该使用哪个节点?

也许这与文件权限有关。尝试将此文件放在 /home/{user} 中。

您可以在节点上为您的 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

The file , archive elements make available, to map-reduce jobs, files and archives. If the specified path is relative, it is assumed the file or archiver are within the application directory, in the corresponding sub-path. If the path is absolute, the file or archive it is expected in the given absolute path.

Files specified with the file element, will be symbolic links in the home directory of the task.

...

所以在最简单的情况下,您将文件 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 复制到该节点,您可以将其作为本地文件引用。