最近在做MySQL向infobright的迁移工作,用的方法是shell脚本的方法。之前听说过有datax的方法也可以做数据流转,今天下班后,就试了试datax的方法,整个过程还是比较顺利的。记录一下。
01
datax介绍
Datax是阿里的一个开源项目,项目地址放在这里:
https://github.com/alibaba/DataX
它的主要用途是数据流转,是一个易购数据源离线同步工具,所谓的异构,就是指来源不同,晚上有张图画的比较好,截取一下大家看看:
它可以将各种来源不同的数据之间进行高效稳定的同步,现在在阿里内部被广泛使用。
数据流转的过程也很简单,画成图就是下面这样:
其中,
Reader:Reader为数据采集模块,负责采集数据源的数据,将数据发送给Framework。
Writer:Writer为数据写入模块,负责不断向Framework取数据,并将数据写入到目的端。
Framework:Framework用于连接reader和writer,作为两者的数据传输通道,并处理缓冲,流控,并发,数据转换等核心技术问题。
目前,datax已经有了全面的插件体系,主流的RDBMS数据库、NOSQL、大数据计算系统都已经接入,其他的介绍官方文档上介绍的比较全,这里就不再赘述了,仅仅提供一张图,供参考:
02
快速上手方法
1、下载
下载的时候,需要注意,不要下载datax的源码,而是在Gtihub界面上的:
Quick Start --->DataX下载地址
此处下载datax.tar.gz的编译好的包,这样,解压一下就能用。如下图:
2、安装
tar -zxvf datax.tar.gz -C /data/
即可。
目录如下:
[root /data/datax]#ll
total 36
drwxr-xr-x 2 root root 4096 Mar 4 17:55 bin
drwxr-xr-x 2 root root 4096 Mar 4 17:55 conf
drwxr-xr-x 2 root root 4096 Mar 6 21:24 job
drwxr-xr-x 2 root root 4096 Mar 4 17:55 lib
drwxr-xr-x 4 root root 4096 Mar 6 10:28 log
drwxr-xr-x 4 root root 4096 Mar 6 10:28 log_perf
drwxr-xr-x 4 root root 4096 Mar 4 17:55 plugin
drwxr-xr-x 2 root root 4096 Mar 4 17:55 script
drwxr-xr-x 2 root root 4096 Mar 4 17:55 tmp
3、进入plugin,该目录下有reader和writer两个文件夹,其中,reader为数据的流出端,writer为数据的流入端。每个文件夹里面包含一些模板:
[root /data/datax/plugin/reader]#ll
total 68
drwxr-xr-x 3 root root 4096 Mar 4 17:55 drdsreader
drwxr-xr-x 3 root root 4096 Mar 4 17:55 ftpreader
drwxr-xr-x 3 root root 4096 Mar 4 17:55 hbase094xreader
drwxr-xr-x 3 root root 4096 Mar 4 17:55 hbase11xreader
drwxr-xr-x 3 root root 4096 Mar 4 17:55 hdfsreader
drwxr-xr-x 3 root root 4096 Mar 4 17:55 mongodbreader
drwxr-xr-x 3 root root 4096 Mar 4 18:15 mysqlreader
drwxr-xr-x 3 root root 4096 Mar 4 17:55 odpsreader
drwxr-xr-x 3 root root 4096 Mar 4 17:55 oraclereader
drwxr-xr-x 3 root root 4096 Mar 4 17:55 ossreader
drwxr-xr-x 3 root root 4096 Mar 4 17:55 otsreader
drwxr-xr-x 3 root root 4096 Mar 4 17:55 otsstreamreader
drwxr-xr-x 3 root root 4096 Mar 4 17:55 postgresqlreader
drwxr-xr-x 3 root root 4096 Mar 4 17:55 rdbmsreader
drwxr-xr-x 3 root root 4096 Mar 4 17:55 sqlserverreader
drwxr-xr-x 3 root root 4096 Mar 4 17:55 streamreader
drwxr-xr-x 3 root root 4096 Mar 4 17:55 txtfilereader
这些模板里面如同名字前缀一样,是指代的某一类数据库的配置模板,打开一个mysqlread看看其中的文件plugin_job_template.json看看:
{
"name": "mysqlreader",
"parameter": {
"username": "",
"password": "",
"column": [],
"connection": [
{
"jdbcUrl": [],
"table": []
}
],
"where": ""
}
}
这就是mysql作为数据流出端需要配置的流转任务文件。当然datax在github上对于每种reader都做了说明,路径如下:
以mysql的为例,就可以在这个路径下找到mysql作为reader插件的说明文档。内容太多,我这里不再一一列举,说下目录即可:
地址:
https://github.com/alibaba/DataX/blob/master/mysqlreader/doc/mysqlreader.md
其中给了一些配置样例,然后针对每种样例还有参数说明,算是比较详细了。
最后是使用的约束限制和问题排查案例,这里不再截图。
4、上手配置
我们以MySQL到MySQL的流转为例,读完了上面的参数介绍,可以在指定的/data/datax/job文件夹中配置一个流转的任务,他是一个指定的json文件:
[root /data/datax/job]#ll
total 12
-rwxrwxrwx 1 501 20 1587 Nov 24 2017 job.json
-rwxr-xr-x 1 root root 1926 Mar 6 21:24 mysql_202_to_203.json
我的json文件名字叫mysql_202_to_203,其中
202、203代表IP地址:
xxx.xxx.xxx.202
xxx.xxx.xxx.203
内容如下:
{
"job": {
"setting": {
"speed": {
"channel": 3
},
"errorLimit": {
"record": 0,
"percentage": 0.02
}
},#content前的部分可以按照上面的方法配置,具体参数含义可自行查询
"content": [
{
"reader": {#这个是reader的开始部分
"name": "mysqlreader",#名称
"parameter": {#数据流出端的参数
"username": "dba_yeyz",#流出端mysql的账号
"password": "dba_yeyz",#流出端mysql密码
"column": [#要流出的数据列,为什么没有表名?在后面。
"id",
"name"
],
"splitPk": "id",#主键
"connection": [#连接信息
{
"table": [#表名
"test"
],
"jdbcUrl": [#连接信息,包含IP、port、db_name
"jdbc:mysql://xxxxxxxx.203:4306/test"
]
}
]
}
},
"writer": {#writer插件
"name": "mysqlwriter",
"parameter": {
"writeMode":"insert",#写入模式,使用insert方法插入还是使用replace方法插入
"username":"dba_yeyz",
"password":"dba_yeyz",
"column":[
"id",
"name"
],
"preSql":["delete from test"],#执行插入前需要执行的SQL,清空表内容
"connection":[#writer端的连接信息
{
"jdbcUrl":"jdbc:mysql://xxxxxxxx:4306/yeyztest",
"table":[
"test"
]
}
]
}
}
}
]
}
}
5、仿造数据
在202上创建表,然后插入相关数据:
mysql>>insert into test values (1,'zhangsan'),(2,'lisi');
Query OK, 2 rows affected (0.01 sec)
在203上也创建相关表,然后插入数据
mysql--dba_admin@127.0.0.1:yeyztest 21:25:33>>select * from test;
+----+------+
| id | name |
+----+------+
| 2 | lisi |
+----+------+
1 row in set (0.00 sec)
6、运行脚本
./datax.py ../job/mysql_202_to_203.json
当然,你可以写绝对路径。
执行完毕后,可以看到打印了相关执行内容:
2020-03-06 21:24:52.454 [job-0] INFO JobContainer -
任务启动时刻 : 2020-03-06 21:24:41
任务结束时刻 : 2020-03-06 21:24:52
任务总计耗时 : 10s
任务平均流量 : 1B/s
记录写入速度 : 0rec/s
读出记录总数 : 2
读写失败总数 : 0
来看203的结果:
mysql--dba_admin@127.0.0.1:yeyztest 21:25:36>>select * from test;
+----+----------+
| id | name |
+----+----------+
| 1 | zhangsan |
| 2 | lisi |
+----+----------+
2 rows in set (0.00 sec)
结果和我们想象的一致,202到203的同步过程中,先使用我们配置的preSql删除了203的test表,然后再导入了202的数据。
至此,完成数据同步。
当然这个只是全量同步方法,增量同步的时候,需要用到datax.py当中的参数-p来透传相关增量字段参数值到job.json文件中的变量中,job.json中的文件可以使用where参数,来确定需要同步表中的哪些符合条件的内容。
此处不予以展开,有需要可以私信我要相关代码。不过自己开发起来也不是很难,大家可以尝试尝试。
扫码关注腾讯云开发者
领取腾讯云代金券
Copyright © 2013 - 2025 Tencent Cloud. All Rights Reserved. 腾讯云 版权所有
深圳市腾讯计算机系统有限公司 ICP备案/许可证号:粤B2-20090059 深公网安备号 44030502008569
腾讯云计算(北京)有限责任公司 京ICP证150476号 | 京ICP备11018762号 | 京公网安备号11010802020287
Copyright © 2013 - 2025 Tencent Cloud.
All Rights Reserved. 腾讯云 版权所有