oozie定时循环调度sqoop job 增量导数入hive
假设oracle里面有一个student表每10分钟有一批新增的数据,现在想要把数据同步到hive,实现思路是用oozie的coordinator定义一个job,job里面调度workflow用sqoop从oracle里增量导数入hive。具体过程如下:
利用coordinate每隔10分钟调度一次sqoop从oracle增量取数到hive的job,要注意coordinator.xml中的时间设置,oozie的时间是UTC,美国的太平洋标准时间PST8PDT是西8区,就是比国际时间UTC慢8小时,而北京时间是东8区,比UTC快8小时,所以若现在北京时间是2013年7月29日16点30分,想要定义一个job是在2013年7月29日17点00分开始运行,则coordinator.xml中的开始运行时间要设置为(17-8=9):
start=2013-07-29T09:00Z
job properites:
nameNode=hdfs://BigInsightMaster:9000
jobTracker=BigInsightMaster:9001
queueName=default
examplesRoot=examples
oozie.coord.application.path=${nameNode}/user/${user.name}/${examplesRoot}/apps/cron
start=2013-07-29T08:00Z
end=2013-07-29T08:20Z
oozie.use.system.libpath=true
workflowAppUri=${nameNode}/user/${user.name}/${examplesRoot}/apps/sqoop
workflow.xml:
<coordinator-app name="cron-coord" frequency="${coord:minutes(10)}" start="${start}" end="${end}" timezone="UTC"
xmlns="uri:oozie:coordinator:0.2">
<action>
<workflow>
<app-path>${workflowAppUri}</app-path>
<configuration>
<property>
<name>jobTracker</name>
<value>${jobTracker}</value>
</property>
<property>
<name>nameNode</name>
<value>${nameNode}</value>
</property>
<property>
<name>queueName</name>
<value>${queueName}</value>
</property>
</configuration>
</workflow>
</action>
</coordinator-app>
一、oozie调度sqoop直接导数入hive --全量
import --hive-import --connect jdbc:oracle:thin:@192.168.1.8:1521:ORCL --username SCOTT --password tiger --table STUDENT -m 1
二、oozie调度sqoop直接导数入hive --增量
import --hive-import --connect jdbc:oracle:thin:@192.168.1.8:1521:ORCL --username SCOTT --password tiger -m 1 --table STUDENT --check-column SID --incremental append --last-value 4
若要用配置文件
--options-file importoracle.txt --table STUDENT --check-column SID --incremental append --last-value 0
importoracle.txt#importoracle.txt
#
# Options file for Sqoop import
#
# Specifies the tool being invoked
import
--hive-import
# Connect parameter and value
--connect
jdbc:oracle:thin:@192.168.1.8:1521:ORCL
# Username parameter and value
--username
SCOTT
# password parameter and value
--password
tiger
# m
-m
1
#
# Remaining options should be specified in the command line.
#
三、oozie调度sqoop job 增量导数入hive
oozie调度shell和sqoop 一样,用一个mapreduce程序调度,在hadoop集群随机选择一个node(namenode或者datanode)运行shell或者sqoop job,所以sqoop-site.xml应该在所有的node上是一样的配置,需要在所有node上的sqoop-site.xml中设置sqoop.metastore.client.record.password为true,若只在namenode上设置,oozie调度sqoop的job的时候还是会报错:
[main] ERROR org.apache.sqoop.manager.OracleManager - Failed to list columns
java.sql.SQLException: ORA-01005: null password given; logon denied
因为是随机选一个node执行sqoop job,而sqoop job的元数据信息是存储在hsqldb关系型数据库中的,sqoop的metastore默认是存储在$HOME/.sqoop/下的,是存储在本地的,如果只在namenode上建job,若oozie把sqoop job分配给其他node执行,就会报错:
ERROR org.apache.sqoop.tool.JobTool - I/O error performing job operation: java.io.IOException: Cannot restore missing job stujob
因为在其他node的本地metastore里面没有相关job的信息,job的信息只有namenode才有。虽然sqoop metastore可以通过sqoop-site.xml里面的
sqoop.metastore.server.location修改本地存储路径,通过sqoop.metastore.client.autoconnect.url设置metastore connecturl,但是要在oozie中执行,必须用share metastore。
1)启动 share metastore service,命令:
bin/sqoop metastore
2)修改sqoop-site.xml中的sqoop.metastore.server.port 为16000
设置sqoop.metastore.server.location 为/tmp/sqoop-metastore/shared.db
3)创建job
bin/sqoop job --meta-connect jdbc:hsqldb:hsql://BigInsightMaster:16000/sqoop --create stujob -- import --hive-import --connect jdbc:oracle:thin:@192.168.1.8:1521:ORCL --username SCOTT --password tiger -m 1 --table STUDENT --check-column SID --incremental append --last-value 0
注意参数--meta-connect jdbc:hsqldb:hsql://BigInsightMaster:16000/sqoop 的顺序,若放在最后面会执行失败,例如
bin/sqoop job --create stujob -- import --hive-import --connect jdbc:oracle:thin:@192.168.1.8:1521:ORCL --username SCOTT --password tiger -m 1 --table STUDENT --check-column SID --incremental append --last-value 0 --meta-connect jdbc:hsqldb:hsql://BigInsightMaster:16000/sqoop
bin/sqoop job --meta-connect jdbc:hsqldb:hsql://BigInsightMaster:16000/sqoop --list
bin/sqoop job --meta-connect jdbc:hsqldb:hsql://BigInsightMaster:16000/sqoop --delete stujob
4)在hive中预先建student表
5)设置oozie的workfow.xml如下(其他内容与sqoop导数入hive配置一样)
job
--exec
stujob
--meta-connect
jdbc:hsqldb:hsql://BigInsightMaster:16000/sqoop
6)执行oozie的workflow
export OOZIE_URL="http://192.168.1.27:8280/oozie"
oozie job -config examples/apps/sqoop/job.properties -run
青春就应该这样绽放 游戏测试:三国时期谁是你最好的兄弟!! 你不得不信的星座秘密