我正在运行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工作,但没有任何作用。请帮忙。
答案 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
的同一台机器上执行了这项工作请确保您已完成以下操作
对于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没有运行。要解决它:
sqoop-metastore
命令在节点之一上启动metastore,$ ps aux | grep sqoop
应该以Sqoop metastore的形式返回结果之一,sqoop-site.xml
文件中指定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 &