使用 Oozie 永久运行 Sqoop 作业

Posted

技术标签:

【中文标题】使用 Oozie 永久运行 Sqoop 作业【英文标题】:Sqoop job running forever using Oozie 【发布时间】:2014-10-13 10:53:23 【问题描述】:

我们有两个节点 hadoop 纱线集群,它是 hadoop 2.2,我们在其上使用 oozie 在单个工作流中安排了两个动作,第一个动作是 python map-reduce 流动作,第二个是sqoop export作业,实际上是将map-reduce流式动作的输出传输到mysql数据库。

流式操作成功执行,这导致 sqoop 作业的启动,该作业一直保持运行。

stdout 结果如下。

Sqoop command arguments :
         export
         --connect
         jdbc:mysql://localhost/database
         --username
         root
         --password
         root
         --table
         tableName
         --direct
         --export-dir
        /user/hduser/oozieProject/workflow/output

 =================================================================
Invoking Sqoop command line now >>>

2137 [main] WARN  org.apache.sqoop.tool.SqoopTool  - $SQOOP_CONF_DIR has not been set in the environment. Cannot check for additional configuration.
2158 [main] INFO  org.apache.sqoop.Sqoop  - Running Sqoop version: 1.4.4.2.0.6.1-102
2170 [main] WARN  org.apache.sqoop.tool.BaseSqoopTool  - Setting your password on the command-line is insecure. Consider using -P instead.
2178 [main] WARN  org.apache.sqoop.ConnFactory  - $SQOOP_CONF_DIR has not been set in the environment. Cannot check for additional configuration.
2197 [main] INFO  org.apache.sqoop.manager.MySQLManager  - Preparing to use a MySQL streaming resultset.
2197 [main] INFO  org.apache.sqoop.tool.CodeGenTool  - Beginning code generation
2464 [main] INFO  org.apache.sqoop.manager.SqlManager  - Executing SQL statement:     SELECT t.* FROM `missedCalls` AS t LIMIT 1
2483 [main] INFO  org.apache.sqoop.manager.SqlManager  - Executing SQL statement: SELECT t.* FROM `missedCalls` AS t LIMIT 1
2485 [main] INFO  org.apache.sqoop.orm.CompilationManager  - HADOOP_MAPRED_HOME is /usr/local/hadoop
3838 [main] INFO  org.apache.sqoop.orm.CompilationManager  - Writing jar file: /tmp/sqoop-hduser/compile/21bd1d5fe13adeed4f46a09f8b3d38fe/missedCalls.jar
3847 [main] INFO  org.apache.sqoop.mapreduce.ExportJobBase  - Beginning export of missedCalls
Heart beat
Heart beat
Heart beat
Heart beat
Heart beat
Heart beat
Heart beat
Heart beat

作业属性如下

nameNode=hdfs://master:54310
jobTracker=master:8035
queueName=default

oozie.libpath=$nameNode/user/hduser/share/lib
oozie.use.system.libpath=true
oozie.wf.rerun.failnodes=true

oozieProjectRoot=$nameNode/user/hduser/oozieProject
appPath=$oozieProjectRoot/workflow
oozie.wf.application.path=$appPath
oozieLibPath=$oozie.libpath

mapred.tasktracker.map.tasks.maximum=4
mapred.tasktracker.reduce.tasks.maximum=4

inputDir=$oozieProjectRoot/data/*
outputDir=$appPath/output

工作流xml如下

<!--Oozie workflow file: workflow.xml --> 
<workflow-app name="WorkflowStreamingMRAction-Python" xmlns="uri:oozie:workflow:0.1">
<start to="streamingaAction"/>
<action name="streamingaAction">
    <map-reduce>
        <job-tracker>$jobTracker</job-tracker>
        <name-node>$nameNode</name-node>
        <prepare>
            <delete path="$outputDir"/>
        </prepare>
        <streaming>
            <mapper>python mapper.py</mapper>
            <reducer>python reducer.py</reducer>
        </streaming>
        <configuration>
            <property>
                <name>oozie.libpath</name>
                <value>$oozieLibPath/mapreduce-streaming</value>
            </property>
            <property>
                <name>mapred.input.dir</name>
                <value>$inputDir</value>
            </property>
            <property>
                <name>mapred.output.dir</name>
                <value>$outputDir</value>
            </property>
            <property>
                <name>mapred.reduce.tasks</name>
                <value>4</value>
            </property>
        </configuration>
        <file>$appPath/mapper.py#mapper.py</file>
        <file>$appPath/reducer.py#reducer.py</file>
    </map-reduce>
    <ok to="sqoopAction"/>
    <error to="killJobAction"/>
    </action>

    <action name="sqoopAction">
        <sqoop xmlns="uri:oozie:sqoop-action:0.2">
            <job-tracker>$jobTracker</job-tracker>
            <name-node>$nameNode</name-node>
            <command>export --connect jdbc:mysql://localhost/database --username root --password myPwd --table tableName --direct --export-dir /user/hduser/oozieProject/workflow/output</command>
        </sqoop>        
    <ok to="end"/>
    <error to="killJobAction"/>
    </action>
<kill name="killJobAction">
<message>"Killed job due to error: $wf:errorMessage(wf:lastErrorNode())"</message>
</kill>
<end name="end" />

请告知可能出了什么问题?

谢谢

【问题讨论】:

【参考方案1】:

它不会永远运行。你只需要等待。

首先,您在上面看到的 Sqoop 导出作业只是一个 Oozie 调度作业。 Heart beat 表示它现在正在运行。你只需要等待。其实你可以去YARN资源管理器页面(一般是http://$namenode:8088/cluster),然后就可以找到“真正的”Sqoop导出作业了。 (我猜映射器的默认数量是 4。)

其次,Sqoop 使用INSERT 语句进行“导出”,因此比较慢。当表很大时,我不建议使用 Sqoop 导出,例如,当它有超过 100 万个条目时。

第三,由于我注意到您尝试导出到 MySQL,您可以尝试批处理模式,它以这种方式运行 INSERT 查询:INSERT INTO &lt;TABLE&gt; VALUES (&lt;ROW1&gt;), (&lt;ROW2&gt;), etc.

因此,您可以将命令更改为: sqoop export -D sqoop.export.records.per.statement=1000 --connect jdbc:mysql://localhost/database --username root --password myPwd --table tableName --direct --export-dir /user/hduser/oozieProject/workflow/output --batch

【讨论】:

实际上我们遇到问题的原因是因为 MySQL。我将my.cnf文件中的绑定地址从localhost配置为MySQL服务器所在机器的IP地址,并授予网络中其他机器访问MySQL服务器的权限,然后在sqoop命令中我们将“localhost”替换为服务器所在的机器名称。从而解决了我的问题。

以上是关于使用 Oozie 永久运行 Sqoop 作业的主要内容,如果未能解决你的问题,请参考以下文章

sqoop 作业将数据导出到 mysql,卡在地图 100% 且状态正在运行

通过 oozie 从 sqoop 作业增量导入不会更新 sqoop 元存储中的 incremental.last.value

Oozie Sqoop 工作

使用带有 Oozie 的 sqoop 观察重复项

Sqoop - 使用 Oozie 导入 Hive 失败

sqoop 作业 shell 脚本在 oozie 中并行执行