批量生成数据迁移神器datax的json配置文件

6 篇文章 0 订阅
6 篇文章 0 订阅

项目背景

项目每天需要从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

  • 2
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 6
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值