项目背景
项目每天需要从oracle,gbase8a,mysql三种数据库中抽取增量数据和全量数据到阿里的ADS中,之前是基于kettle+crontab来实现数据的抽取与调度的。因kettle配置简易,但抽取效率低,无法满足业务的日常使用,目前开源软件datax在测试期间性能与效果都能满足业务需要,但也有一个缺点,那就是datax的json配置文件配置起来不太方面,于是就有了这篇文章。
项目需求
1、将kettle同步的业务表修改为了datax同步
2、oracle数据库中有70张业务,gbase8a中有60张,mysql中有85张
3、ADS中的表结构与oracle,gbase8a中的业务表结构保持一致。
实现思路
datax的主要工作是书写json配置文件,即源库与目标库中业务表字段的对应关系,而这一部分都是ctl +c、ctl+v 操作,所以通过相应的SQL语句与SHELL相结合即可解决繁琐的配置操作。
1、制定json同步模板及格式
2、通过SQL语句获取业务表的字段
3、通过SHELL批量生成同步表的json配置文件
实现方式
1、模板格式
gbase_template.txt
{
"job": {
"setting": {
"speed": {
"byte": 1048576
},
"errorLimit": {
"record": 0,
"percentage": 0.02
}
},
"content": [
{
"reader": {
"name": "rdbmsreader",
"parameter": {
"username": "${gbase_username}",
"password": "${gbase_password}",
"connection": [
{
"querySql": [
"select source_sql from table_name"
],
"jdbcUrl": [
"${gbase_jdbc_url}"
]
}
],
"fetchSize": 1024
}
},
"writer": {
"name": "mysqlwriter",
"parameter": {
"writeMode": "insert",
"username": "${ads_username}",
"password": "${ads_password}",
"preSql": [
"truncate table table_name"
],
"column":[
target_sql
],
"connection": [
{
"table": [
"table_name"
],
"jdbcUrl": "${ads_jdbc_url}"
}
]
}
}
}
]
}
}
oracle_ template配置模板
{
"job": {
"setting": {
"speed": {
"byte": 1048576
},
"errorLimit": {
"record": 0,
"percentage": 0.02
}
},
"content": [
{
"reader": {
"name": "oraclereader",
"parameter": {
"username": "${oracle_username}",
"password": "${oracle_password}",
"connection": [
{
"querySql": [
"select source_sql from table_name"
],
"jdbcUrl": [
"${oracle_jdbc_url}"
]
}
],
"fetchSize": 1024
}
},
"writer": {
"name": "mysqlwriter",
"parameter": {
"writeMode": "insert",
"username": "${ads_username}",
"password": "${ads_password}",
"preSql": [
"truncate table table_name"
],
"column":[
target_sql
],
"connection": [
{
"table": [
"table_name"
],
"jdbcUrl": "${ads_jdbc_url}"
}
]
}
}
}
]
}
}
2、获取业务表字段的SQL语句
SQL语句生成的格式内容如下,后面发现"truncate table schema_name.table_name"可以不需要的
oracle_schema_name_table_name "truncate table schema_name.table_name" schema_name.table_name obj_id,obj_dispidx "obj_id","obj_dispidx"
3、shell脚本编写
#!/bin/bash
#function:generate configuration datax json file
#author:by lineqi
#crt_time:2020-10-13
v_dir=/data/datax_jobs
cd $v_dir
cat oracle_info.txt |while read line
do
v_datax_name=`echo $line|awk '{print $1}'`
v_table_name=`echo $line|awk '{print $5}'`
v_source_sql=`echo $line|awk '{print $6}'`
v_target_sql=`echo $line|awk '{print $7}'`
#echo $v_datax_name
#echo $v_table_name
#echo $v_source_sql
#echo $v_target_sql
if [ -f "$v_datax_name.json" ]; then
mv -f $v_datax_name.json $v_datax_name.json.bak
fi
cp oracle_template.txt $v_datax_name.json
sed -i "s/table_name/$v_table_name/g" $v_datax_name.json
sed -i "s/source_sql/$v_source_sql/g" $v_datax_name.json
sed -i "s/target_sql/$v_target_sql/g" $v_datax_name.json
done
遇到的问题
1、mysql5.6中group_concat函数默认长度为1024,如果将多个列转成一行时,超过该长度会被截取
解决方法:
SET GLOBAL group_concat_max_len = 4294967295;
SET SESSION group_concat_max_len = 4294967295
总结
1、这里只写的datax配置文件批量的生成方式,最终还是需要通过调度来实现数据同步操作,这里采用的是dolphinscheduler1.3.2最新版来实现调度工作,dolphinscheduler的配置在后面的文章中给出.
2、模板里的数据库连接信息是在dolphinscheduler里配置好的
参考资料
dolphinscheduler:https://www.yuque.com/docs/share/454e9a42-b6c7-44b2-9d29-1d5795199456?#a92bb2f4
datax:https://github.com/alibaba/DataX