记录datax使用过程中的一系列需要主要的地方以及优化和采用调度工具调度datax任务
1.使用crontab调度datax任务,仅做数据数据同步因为他的依赖关系不好定义,最好是处理一个一个单独的同步任务
2.首先我们需要建立对对应的同步任务,这我们假设建立了一个mysql2mysql的任务名为'***.json'
3.之后我们建立一个shell脚本去调度之前的datax同步任务
脚本内容:
#这一行在脚本中必须添加否无法执行
#!/bin/sh
#定义时间
time=$(date "+%Y-%m-%d %H:%M:%S")
#由于crontab不会刷新配置文件,我们手动刷新配置文件,防止任务同步失败
source /etc/profile
#也是刷新配置文件(最好有不然任务容易失败)
source ~/.bash_profile
#将日志对应到指定日期的文件中,例如2022年11月16日跑的任务,会产生一个对应日期的文件
echo `date "+%Y-%m-%d %H:%M:%S"` >> /opt/modules/datax/log/datax_log.log
#切换这datax所在的bin目录下
cd /opt/modules/datax/bin
#echo到控制台说明已经进入bin目录
echo '进入bin目录'
#通过python调度 对应目录下面的数据同步任务'***.json'
python datax.py /opt/modules/datax/job/job.json
#执行结束打印日志至控制台
echo 'hello!'
通过shell命令替换json或者某个文件中的某个值
替换文件为json:当我们想要动态替换掉文件中的某一个key的值的时候可以用,例如我们在datax动态同步数据的时候我们需要每天更改文件中的where字段, 按照时间的话我们就可以根据时间进行修改,这样是可行的
示例shell文件如下:
#!bin/bash
#其中的where是我需要替换的那个字段对应的key,{print NR}可以获取该key位于第几行
old_line=$(awk -F"\"" '/where/{print NR}' 自己的文件名)
#其中的where是我要替换的那个字段对应的key,{print $4}可以获取where对应的values
old_test=$(awk -F"\"" '/where/{print $4}' 自己的文件名)
new_test=自己想要替换成的值
#这里的意思是将文件中指定列的旧数据替换成新数据,适用于某个文本文件中可能存在多个的情况
sed -e "@$old_line s@$old_test@$new_test@" -i 自己的文件名
#这里的意思也是将文件中的旧数据替换成新数据,但是这个文本再文件中只有1个的时候就可以做到全局替换
sed -e "s@$old_test@$new_test@g" -i 自己的文件名
下面写一个具体的案例:我想替换test.json中where这个key所对应的值,后面的$4,实际应用的时候可以根据自己的json文件进行调试,$1,$2,$3……,看那个能拿到你想要的数据
#!bin/bash
#查找test.json文件中where对应的值
old_test=$(awk -F"\"" '/where/{print $4}' test.json)
#我治理想要将他替换成昨天的日期,时间格式为20221212
new_test=$(date -d yesterday +%Y%m%d)
#拼接where条件中的string,riqi=20221212类似于这种
new_test_final='riqi='$new_test
#替换掉test.json文件中where对应的字符
sed -e "s@$old_test@$new_test_final@g" -i test.json
通过