使用Oozie在YARN上运行Sqoop作业



我在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}。

相关内容

  • 没有找到相关文章

最新更新