在oozie的sqoop exec工作不起作用

时间:2015-08-28 11:09:03

标签: oozie sqoop2 sqoop

我正在运行3节点HDP 2.2群集。 Oozie版本是4.1.0.2.2,Sqoop版本是1.4.5.2.2。我正在使用Sqoop作业从RDBMS向HDFS进行增量导入,如下所示,

sqoop job –create JOB1 –meta-connect “jdbc:hsqldb:hsql://ip-address:16000/sqoop” — import –connect jdbc:oracle:thin:@ip-address:db –username db_user –password-file hdfs://ip-address:8020/user/oozie/.password_sqoop –table TABLE1 –target-dir /user/incremental/ –incremental lastmodified –check-column LAST_UPDATED –last-value “2013-08-12 18:13:44.0″ –merge-key ID –fields-terminated-by ‘|';

sqoop job -exec JOB1

从命令提示符运行时,上面的2个sqoop命令工作正常。我正在使用sqoop-metastore(HSQLDB)来存储sqoop作业。

sqoop创建作业在OOZIE中工作,我能够看到在oozie作业完成后sqoop-metabore中列出的sqoop作业。

但是当我把sqoop exec作业放入oozie工作流程时,我得到“Main class [org.apache.oozie.action.hadoop.SqoopMain], exit code [1]”错误。然而,底层地图减少作业显示为已成功完成。检查了/ var / log / oozie中的日志,但也没有。

workflow.xml:

<workflow-app xmlns=”uri:oozie:workflow:0.4″ name=”oozie-wf”>
<start to=”sqoop-wf”/>
<action name=”sqoop-wf”>
<sqoop xmlns=”uri:oozie:sqoop-action:0.2″>
<job-tracker>${jobTracker}</job-tracker>
<name-node>${nameNode}</name-node>
<configuration>
<property>
<name>fs.hdfs.impl.disable.cache</name>
<value>true</value>
</property>
</configuration>
<command>job –meta-connect “jdbc:hsqldb:hsql://ip-address:16000/sqoop” –exec JOB1</command>
</sqoop>
<ok to=”end”/>
<error to=”fail”/>
</action>
<kill name=”fail”>
<message>Failed, Error Message[${wf:errorMessage(wf:lastErrorNode())}]</message>
</kill>
<end name=”end”/>
</workflow-app>

job.properties:

nameNode=hdfs://ip-address:8020
jobTracker=ip-address:8050

oozie.wf.application.path=hdfs://ip-address:8020/user/oozie/sqoopoozie
oozie.use.system.libpath=true
oozie.sqoop.log.level=DEBUG

我已经尝试过多种不同的方式来为oozie中的sqoop exec工作,但没有任何作用。请帮忙。

3 个答案:

答案 0 :(得分:1)

请确保您在sqoop-site.xml中指定了Metastore,并且您正在oozie工作流文件夹中传递站点xml。您可以使用xml标记传递它。

答案 1 :(得分:1)

令我困惑的是sqoop job --exec JOB1如何在命令提示符下工作。执行作业的正确语法(来自命令提示符)将是

sqoop job --exec JOB1 --meta-connect jdbc:hsqldb:hsql://ip-address:16000/sqoop

也许您是从运行sqoop Metastore

的同一台机器上执行了这项工作

请确保您已完成以下操作

  1. 使用ip = ip-address
  2. 在计算机上启动sqoop Metastore
  3. 在sqoop-site.xml中进行必要的配置更改(按照this链接)
  4. 对于oozie工作流程,请尝试以下workflow.xml

    <workflow-app xmlns=”uri:oozie:workflow:0.4″ name=”oozie-wf”>
        <start to=”sqoop-wf”/>
        <action name=”sqoop-wf”>
            <sqoop xmlns=”uri:oozie:sqoop-action:0.2″>
                <job-tracker>${jobTracker}</job-tracker>
                <name-node>${nameNode}</name-node>
                <configuration>
                    <property>
                        <name>fs.hdfs.impl.disable.cache</name>
                        <value>true</value>
                    </property>
                </configuration>
                <arg>job</arg>
                <arg>--exec</arg>
                <arg>JOB1</arg>
                <arg>--meta-connect jdbc:hsqldb:hsql://ip-address:16000/sqoop</arg>
            </sqoop>
            <ok to=”end”/>
            <error to=”fail”/>
        </action>
        <kill name=”fail”>
            <message>Failed, Error Message[${wf:errorMessage(wf:lastErrorNode())}]</message>
        </kill>
        <end name=”end”/>
    </workflow-app>
    

答案 2 :(得分:0)

在我们的集群中,通过Hue UI创建作业而未指定元存储(使用--meta-connect参数)导致sqoop job --list有时有时返回作业命令。在命令提示符下,在工作的同一台计算机上创建和列出作业;但是,机器B找不到在机器A上创建的作业。

如果您也无法访问作业,则可以访问在另一个节点上创建的作业,这似乎是因为您的sqoop metastore没有运行。要解决它:

  1. 使用sqoop-metastore命令在节点之一上启动metastore,
  2. 检查metastore是否正在运行:$ ps aux | grep sqoop应该以Sqoop metastore的形式返回结果之一,
  3. sqoop-site.xml文件中指定metastore路径。在我们的情况下,虽然我们无法进行其他工作,所以我们使用下一步完成了该工作,
  4. 如有必要,在shell和Hue UI中,在每个sqoop作业命令(创建,列表,显示,执行,删除)中指定metastore路径为
    $ sqoop job --exec my_job --meta-connect jdbc:hsqldb:hsql://node-running-metastore:16000/sqoop

注意:要启动元存储,请考虑使用&nohup在后​​台运行元存储过程并将日志捕获到文件中:

$ nohup sqoop-metastore &>> /tmp/nohup-sqoop-metastore.out &