背景
業(yè)務(wù)系統(tǒng)庫(kù)數(shù)據(jù)包含了大量歷史數(shù)據(jù),核心的表超過(guò)千萬(wàn)級(jí)甚至億級(jí)后,傳統(tǒng)在業(yè)務(wù)庫(kù)上做數(shù)據(jù)分析已不合時(shí)宜骇塘,需要遷移至大數(shù)據(jù)平臺(tái)(hive/spark sql/impala)做數(shù)據(jù)分析,如果按天全量導(dǎo)入至平臺(tái)不僅消耗大量服務(wù)器資源并且全量讀取業(yè)務(wù)庫(kù)全表速度也會(huì)超慢羊壹,這時(shí)需要增量導(dǎo)入的功能卫袒,因?yàn)闃I(yè)務(wù)系統(tǒng)的表會(huì)用自增ID的標(biāo)志,可以按天截取新增數(shù)據(jù)導(dǎo)入平臺(tái)滚朵。
sqoop增量遷移數(shù)據(jù)方式對(duì)比
一種是 append冤灾,即通過(guò)指定一個(gè)遞增的列,比如:
--incremental append --check-column num_iid --last-value 0
另種是可以根據(jù)時(shí)間戳辕近,比如:
--incremental lastmodified --check-column created --last-value '2012-02-01 11:0:00'
就是只導(dǎo)入created 比'2012-02-01 11:0:00'更大的數(shù)據(jù)。
第一種適合業(yè)務(wù)系統(tǒng)庫(kù)匿垄,一般業(yè)務(wù)系統(tǒng)表會(huì)通過(guò)自增ID作為主鍵標(biāo)識(shí)唯一性移宅。
第二種適合ETL的數(shù)據(jù)
sqoop append模式使用
1.使用 sqoop create-hive-table 生成 hive表結(jié)構(gòu)
2.定義 sqoop job,實(shí)際上是一個(gè)通道,通道的始發(fā)站為mysql對(duì)應(yīng)的表椿疗,終點(diǎn)站為hive對(duì)應(yīng)的表
3.使用 sqoop job執(zhí)行增量導(dǎo)入
注:自己寫(xiě)個(gè)shell定時(shí)跑批或者放到調(diào)度系統(tǒng)定時(shí)執(zhí)行
下面為整個(gè)遷移的腳本示例:
#!/bin/bash
##############################################
## $1:日期 $2:表名
## 第一個(gè)參數(shù)為日期漏峰,第二個(gè)參數(shù)為mysql表名
##############################################
#配置所在數(shù)據(jù)庫(kù)地址
conf_dbhost=xxx
#配置所在數(shù)據(jù)庫(kù)用戶名
conf_username=xxx
#配置所在數(shù)據(jù)庫(kù)密碼
conf_password=xxx
#配置所在數(shù)據(jù)庫(kù)名
conf_dbname=etl
var_etl_date=`mysql -h $conf_dbhost -u$conf_username -p$conf_password -D $conf_dbname -e "SELECT var_value FROM para_etl_var WHERE var_name='{ETL_DATE}';"`
echo $var_etl_date
sys_date=`date -d'-1 day' +%Y-%m-%d`
if [ ${1} == "-" ]
then
# cur_date='2016-09-23'
cur_date=${var_etl_date:10:10}
echo $cur_date
else
#echo "$1"
cur_date=`date --date="${1}" +%Y-%m-%d`
echo $cur_date
fi
echo "$cur_date"
#exit
year=`date --date=$cur_date +%Y`
month=`date --date=$cur_date +%m`
day=`date --date=$cur_date +%d`
echo "cur_date:"${cur_date}
#hive庫(kù)名
hdb=rmdb
#hive表名
hive_table=crm_intopieces_dk
#mysql表名
mysql_table=crm_intopieces_dk
#數(shù)據(jù)倉(cāng)庫(kù)基礎(chǔ)路徑
basedir=/rmdb
#mysql服務(wù)器地址
server=xxx
#mysql端口號(hào)
port=3306
#mysql數(shù)據(jù)庫(kù)名
mysql_database=test
#用戶名
username=xxx
#密碼
password=xxx
#判斷Hive是否存在,不存在執(zhí)行下面創(chuàng)建語(yǔ)句届榄,否則跳過(guò)
#hive -e "use $hdb;select * from $hive_table limit 1;"
if [ $? -ne 0 ]
then
echo "表不存在浅乔,執(zhí)行創(chuàng)建表結(jié)構(gòu)"
sqoop create-hive-table
--connect jdbc:mysql://$server:$port/$mysql_database?tinyInt1isBit=false
--username $username
--password $password
--table $mysql_table
else
echo "表已存在,執(zhí)行增量導(dǎo)入铝条。靖苇。。"
fi
#exit
#
#一種是 append班缰,即通過(guò)指定一個(gè)遞增的列贤壁,比如:
#--incremental append --check-column num_iid --last-value 0
#另種是可以根據(jù)時(shí)間戳,比如:
#--incremental lastmodified --check-column created --last-value '2012-02-01 11:0:00'
#就是只導(dǎo)入created 比'2012-02-01 11:0:00'更大的數(shù)據(jù)埠忘。
echo "創(chuàng)建job"
#append
sqoop job
--create crm_intopieces_dk
-- import --connect jdbc:mysql://$server:$port/$mysql_database?tinyInt1isBit=false
--username $username
--password $password
--table $mysql_table
--hive-import --hive-table $hive_table
--incremental append
--check-column id
--last-value 0
echo "append增量導(dǎo)入模式啟動(dòng)脾拆。。莹妒。"
sqoop job --exec crm_intopieces_dk
exit