ETL工具DataX数据同步,LINUXCRONTAB定时调度

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

ETL⼯具DataX数据同步,LINUXCRONTAB定时调度
DataX 是阿⾥巴巴集团内被⼴泛使⽤的离线数据同步⼯具/平台,实现包括 MySQL、Oracle、SqlServer、Postgre、HDFS、Hive、ADS、HBase、OTS、ODPS 等各种异构数据源之间⾼效的数据同步功能。

例⼦:
全量从MYSQL 同步到MYSQL
{
"job": {
"content":[
{
"reader":{
"name":"mysqlreader",
"parameter":{
"connection":[
{
"querySql":["SELECT * FROM TABEL"],
"jdbcUrl":["jdbc:mysql://127.0.0.1:3306/dsjglpt"],
}
],
"username":"root",
"password":"123456",
"mandatoryEncoding":"UTF-8"
}
},
"writer":{
"name":"mysqlwriter",
"parameter":{
"column": ["*"],
"connection":[
{
"jdbcUrl":"jdbc:mysql://127.0.0.1:3306/dsjglpt_tmp",
"table":["TABEL"],
}
],
"username":"root",
"password":"123456",
"mandatoryEncoding":"UTF-8",
"preSql": ["truncate table TABEL"],
"writeMode": "insert"
}
}
}
],
"setting":{
"errorLimit":{
"record":0
},
"speed":{
"channel":"1"
}
}
}
}
从 MYSQL 同步到 PostgreSQL ,部分配置如下:
"name": "postgresqlwriter"
"jdbcUrl": "jdbc:postgresql://[target_server]:5432/[target_db]",
编写 ty_commit_datax_sjyc.sh (并发任务数)
if [ $# -lt 1 ] ; then
echo "请输⼊正确的参数:并发任务数 "
exit 1;
fi
processNum=$1
##基础路径
base=/home/admin
##新版本的datax
dataxHome=/home/admin/datax/datax3
##配置⽂件⽬录
confBase=`ls ${base}/sjyc/*.json`
##全量json⽬录
qlJsonPath="${base}/sjyc"
##如果统计表记录数⽂件不存在,需先执⾏统计表记录数脚本
#if [ ! -f ${shellPath}/log/count/${syscode}_CountTable.conf ] ;then
# echo "表记录数⽂件${syscode}_CountTable.conf不存在,请先执⾏统计记录数脚本!"
# exit 1;
#fi
startTime=`date '+%Y%m%d%H%M%S'`
##输出⽇志路径
outpath="${base}/log/commit/sjyc/${startTime}"
if [ -d ${outpath} ] ;then
rm -rf ${outpath}
fi
mkdir -p ${outpath}
touch ${outpath}/commitJson.log
touch ${outpath}/succJson.log
touch ${outpath}/failJson.log
mkdir -p ${outpath}/succLog
mkdir -p ${outpath}/failLog
jsonNum=`ls ${qlJsonPath}/*.json | wc -l`
if [ ${processNum} -gt ${jsonNum} ] ;then
echo "并发任务数必须⼩于等于json⽂件数:${jsonNum}"
exit 1;
fi
##以当前进程号命名
fifoName="/tmp/$$.fifo"
mkfifo ${fifoName}
##定义⽂件描述符(fd是⼀个整数,可理解为索引或指针),以读写的⽅式绑定到⽂件描述符3中
exec 3<>"${fifoName}"
##此时可以删除管道⽂件,保留fd即可
rm -rf ${fifoName}
##定义进程数量,向管道⽂件中写⼊进程数量个空⾏
for ((i=1;i<=${processNum};i++)) do
echo >&3
done
##组装dataX 动态参数
##根据配置⽂件ty_createJson.conf中的表匹配json⽬录下的json⽂件,如果⼀个表匹配到多个json⽂件(分区表的情况),则依次提交for file in `ls ${qlJsonPath}/*.json` ;do
##读⼊⼀个空⾏
read -u3
{
jsonName="${file##*/}"
fileName="${jsonName%%.*}"
echo ${jsonName}
echo "${file}" >> ${outpath}/commitJson.log
python ${dataxHome}/bin/datax.py ${file} 2>&1 >> ${outpath}/${fileName}.log
result=$?
if [ ${result} -eq 0 ] ;then
echo "${fileName}" >> ${outpath}/succJson.log
mv -f ${outpath}/${fileName}.log ${outpath}/succLog
else
echo "${fileName}" >> ${outpath}/failJson.log
mv -f ${outpath}/${fileName}.log ${outpath}/failLog
##记录失败的表配置
#echo "${line}" >> ${confBase}/ty_createJson_bsj.conf
fi
#sleep 1
##最后向管道⽂件中写⼊⼀个空⾏
echo >&3
}&
done
done
wait
echo "开始时间:${startTime}" >> ${outpath}/commitJson.log
echo "开始时间:${startTime}"
endTime=`date '+%Y%m%d%H%M%S'`
echo "结束时间:${endTime}" >> ${outpath}/commitJson.log
echo "结束时间:${endTime}"
#关闭⽂件描述符的读
exec 3<&-
#关闭⽂件描述符的写
exec 3>&-
exit 0
编写CRONTAB 脚本(每天6点半执⾏每次执⾏10个JSON⽂件)
crontab-e
30 6 * * * /home/admin/ty_commit_datax_sjyc.sh 10
------------------------------------------------------------------
要实现增量更新,⾸先要 PostgresqlReader 从⽬标数据库读取最⼤⽇期,并⽤ TextFileWriter 写⼊到⼀个 csv ⽂件,这⼀步我的配置如下所⽰:
{
"job": {
"content": [
{
"reader": {
"name": "postgresqlreader",
"parameter": {
"connection": [
{
"jdbcUrl": [
"jdbc:postgresql://[target_server]:5432/[target_db]"
],
"querySql": [
"SELECT max(data_time) FROM public.minute_data"
]
}
],
"password": "...",
"username": "..."
}
},
"writer": {
"name": "txtfilewriter",
"parameter": {
"dateFormat": "yyyy-MM-dd HH:mm:ss",
"fileName": "minute_data_max_time_result",
"fileFormat": "csv",
"path": "/scripts/",
"writeMode": "truncate"
}
}
}
],
"setting": { }
}
}
最后编写增量同步的 shell ⽂件,内容如下:
#!/bin/bash
### every exit != 0 fails the script
set -e
# 获取⽬标数据库最⼤数据时间,并写⼊⼀个 csv ⽂件
docker run --interactive --tty --rm --network compose --volume $(pwd):/scripts \ beginor/datax:3.0 \
/scripts/minute_data_max_time.json
if [ $? -ne 0 ]; then
echo "minute_data_sync.sh error, can not get max_time from target db!"
exit 1
fi
# 找到 DataX 写⼊的⽂本⽂件,并将内容读取到⼀个变量中
RESULT_FILE=`ls minute_data_max_time_result_*`
MAX_TIME=`cat $RESULT_FILE`
# 如果最⼤时间不为 null 的话,修改全部同步的配置,进⾏增量更新;
if [ "$MAX_TIME" != "null" ]; then
# 设置增量更新过滤条件
WHERE="DataTime > '$MAX_TIME'"
sed "s/1=1/$WHERE/g" minute_data.json > minute_data_tmp.json
# 将第 45 ⾏的 truncate 语句删除;
sed '45d' minute_data_tmp.json > minute_data_inc.json
# 增量更新
docker run --interactive --tty --rm --network compose --volume $(pwd):/scripts \ beginor/datax:3.0 \
/scripts/minute_data_inc.json
# 删除临时⽂件
rm ./minute_data_tmp.json ./minute_data_inc.json
else
# 全部更新
docker run --interactive --tty --rm --network compose --volume $(pwd):/scripts \ beginor/datax:3.0 \
/scripts/minute_data.json
fi。

相关文档
最新文档