1、目录
2、DataX3.0使用文档
3、DataX官方概述
4、设计理念
5、当前使用现状
6、DataX3.0框架设计
7、环境准备 :
DataX官方概述
DataX是一个异构数据源离线同步工具,致力于实现包括关系型数据库(Mysql、Oracle等)、HDFS、Hive、ODPS、HBase、FTP等各种异构数据源之间稳定高效的数据同步功能。
设计理念
为了解决异构数据源同步问题, DataX将复杂的网状的同步链路变成了星型数据链路,DataX作为中间传输载体负责连接各种数据源。当需要接入一个新的数据源的时候,只需要将此数据源对接到DataX,便能跟已有的数据源做到无缝数据同步。
当前使用现状
DataX在阿里巴巴集团内被广泛使用,承担了所有大数据的离线同步业务,并已持续稳定运行了6年之久。目前每天完成同步8w多道作业,每日传输数据量超过300TB。
DataX3.0框架设计
环境准备 :linux6.8
python自带的2.7
MySQL 5.7.1
安装
1.先下载: wget http://datax-opensource.oss-cn-hangzhou.aliyuncs.com/datax.tar.gz
2.解压:tar -zxvf datax.tar.gz -C /usr/local/
3.授权: chmod -R 755 datax/*
4.进入目录# cd datax/
5.启动脚本:python datax.py …/job/job.json
若最终 展示如下 既可以开始写自己脚本进行使用
任务启动时刻 : 2019-05-17 02:40:26
任务结束时刻 : 2019-05-17 02:40:36
任务总计耗时 : 10s
任务平均流量 : 253.91KB/s
记录写入速度 : 10000rec/s
读出记录总数 : 100000
读写失败总数 : 0
查看配置模版
python datax.py -r {YOUR_READER} -w {YOUR_WRITER}
示例:
$ cd {YOUR_DATAX_HOME}/bin
$ python datax.py -r streamreader -w streamwriter
DataX (UNKNOWN_DATAX_VERSION), From Alibaba !
Copyright © 2010-2015, Alibaba Group. All Rights Reserved.
Please refer to the streamreader document:
https://github.com/alibaba/DataX/blob/master/streamreader/doc/streamreader.md
Please refer to the streamwriter document:
https://github.com/alibaba/DataX/blob/master/streamwriter/doc/streamwriter.md
Please save the following configuration as a json file and use
python {DATAX_HOME}/bin/datax.py {JSON_FILE_NAME}.json
to run the job
"job" : {
"content" : [
{
"reader" : {
"name" : "streamreader" ,
"parameter" : {
"column" : [],
"sliceRecordCount" : ""
}
},
"writer" : {
"name" : "streamwriter" ,
"parameter" : {
"encoding" : "" ,
"print" : true
}
}
}
],
"setting" : {
"speed" : {
"channel" : ""
}
}
}
脚本编辑
这样就可以进入job中编辑自己的同步表的json了
示例
"job": {
"setting": {
"speed": {
"byte": 1048576,
"channel":"5",
}
},
"content": [
{
"reader": {
//name不能随便改
"name": "mysqlreader",
"parameter": {
"username": "root",
"password": "123456",
"column": ["*"],
" where ":""
"connection": [
{
"table": ["sys_user"],
"jdbcUrl": ["jdbc:mysql://ip:3306/bdc_asis?useUnicode=true&characterEncoding=utf8"]
}
]
}
},
"writer": {
//测试了一下name不能随便改
"name": "mysqlwriter",
"parameter": {
"writeMode": "replace into",
"username": "root",
"password": "1111",
"column":["*"],
"connection": [
{
"table": ["sys_user"],
"jdbcUrl": "jdbc:mysql://ip:3306/bdc_asis?useUnicode=true&characterEncoding=utf8"
}
]
}
}
}
]
}
username 描述:数据源的用户名
password 描述:数据源指定用户名的密码
table 描述:所选取的需要同步的表。使用JSON的数组描述,因此支持多张表同时抽取。当配置为多张表时,用户自己需保证多张表是同一schema结构,MysqlReader不予检查表是否同一逻辑表。注意,table必须包含在connection配置单元中。
column 描述:所配置的表中需要同步的列名集合,使用JSON的数组描述字段信息。用户使用代表默认使用所有列配置,例如[’’]。 支持列裁剪,即列可以挑选部分列进行导出。 支持列换序,即列可以不按照表schema信息进行导出。 支持常量配置,用户需要按照Mysql SQL语法格式: [“id”, “table”, “1”, “‘bazhen.csy’”, “null”, “to_char(a + 1)”, “2.3” , “true”] id为普通列名,table为包含保留在的列名,1为整形数字常量,'bazhen.csy’为字符串常量,null为空指针,to_char(a + 1)为表达式,2.3为浮点数,true为布尔值。
splitPk 描述:MysqlReader进行数据抽取时,如果指定splitPk,表示用户希望使用splitPk代表的字段进行数据分片,DataX因此会启动并发任务进行数据同步,这样可以大大提供数据同步的效能。 推荐splitPk用户使用表主键,因为表主键通常情况下比较均匀,因此切分出来的分片也不容易出现数据热点。 目前 splitPk 仅支持整形数据切分, 不支持浮点、字符串、日期等其他类型 。如果用户指定其他非支持类型, MysqlReader 将报错! 如果 splitPk 不填写,包括不提供 splitPk 或者 splitPk 值为空, DataX 视作使用单通道同步该表数据。
where 描述:筛选条件,MysqlReader根据指定的column、table、where条件拼接SQL,并根据这个SQL进行数据抽取。在实际业务场景中,往往会选择当天的数据进行同步,可以将where条件指定为gmt_create > $bizdate 。注意:不可以将where条件指定为limit 10,limit不是SQL的合法where子句。 where 条件可以有效地进行业务增量同步。如果不填写 where 语句,包括不提供 where 的 key 或者 value , DataX 均视作同步全量数据。
querySql 描述:在有些业务场景下,where这一配置项不足以描述所筛选的条件,用户可以通过该配置型来自定义筛选SQL。当用户配置了这一项之后,DataX系统就会忽略table,column这些配置型,直接使用这个配置项的内容对数据进行筛选,例如需要进行多表join后同步数据,使用select a,b from table_a join table_b on table_a.id = table_b.id 当用户配置 querySql 时, MysqlReader 直接忽略 table 、 column 、 where 条件的配置 , querySql 优先级大于 table 、 column 、 where 选项。 table 必须包含在 connection 配置单元中
执行命令:
python …/bin/datax.py sys_user.json
The last packet sent successfully to the server was 0 milliseconds ago. The driver has not received any packets from the server.]
2019-05-17 08:21:40.626 [job-0] INFO OriginalConfPretreatmentUtil - table:[sys_user] all columns:[id,uuid,username,salt,password,user_type,realname,depart_id,phone,email,user_status,remark,enable,update_time,update_id,create_time,create_id,type].
2019-05-17 08:21:40.626 [job-0] WARN OriginalConfPretreatmentUtil - 您的配置文件中的列配置信息存在风险. 因为您配置的写入数据库表的列为*,当您的表字段个数、类型有变动时,可能影响任务正确性甚至会运行出错。请检查您的配置并作出修改.
2019-05-17 08:21:40.630 [job-0] INFO OriginalConfPretreatmentUtil - Write data [replace INTO %s (id,uuid,username,salt,password,user_type,realname,depart_id,phone,email,user_status,remark,enable,update_time,update_id,create_time,create_id,type) VALUES(?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)], which jdbcUrl like:[jdbc:mysql://10.130.31.73:3306/bdc_asis?useUnicode=true&characterEncoding=utf8&yearIsDateType=false&zeroDateTimeBehavior=convertToNull&tinyInt1isBit=false&rewriteBatchedStatements=true]
2019-05-17 08:21:40.633 [job-0] INFO JobContainer - jobContainer starts to do prepare …
2019-05-17 08:21:40.634 [job-0] INFO JobContainer - DataX Reader.Job [mysqlreader] do prepare work .
2019-05-17 08:21:40.637 [job-0] INFO JobContainer - DataX Writer.Job [mysqlwriter] do prepare work .
2019-05-17 08:21:40.644 [job-0] INFO JobContainer - jobContainer starts to do split …
2019-05-17 08:21:40.645 [job- 0] INFO JobContainer - Job set Max-Byte-Speed to 1048576 bytes.
2019-05-17 08:21:40.650 [job-0] INFO JobContainer - DataX Reader.Job [mysqlreader] splits to [1] tasks.
2019-05-17 08:21:40.653 [job-0] INFO JobContainer - DataX Writer.Job [mysqlwriter] splits to [1] tasks.
2019-05-17 08:21:40.679 [job-0] INFO JobContainer - jobContainer starts to do schedule …
2019-05-17 08:21:40.690 [job-0] INFO JobContainer - Scheduler starts [1] taskGroups.
2019-05-17 08:21:40.698 [job-0] INFO JobContainer - Running by standalone Mode.
2019-05-17 08:21:40.720 [taskGroup-0] INFO TaskGroupContainer - taskGroupId=[0] start [1] channels for [1] tasks.
2019-05-17 08:21:40.727 [taskGroup-0] INFO Channel - Channel set byte_speed_limit to -1, No bps activated.
2019-05-17 08:21:40.728 [taskGroup-0] INFO Channel - Channel set record_speed_limit to -1, No tps activated.
2019-05-17 08:21:40.758 [taskGroup-0] INFO TaskGroupContainer - taskGroup[0] taskId[0] attemptCount[1] is started
2019-05-17 08:21:40.769 [0-0-0-reader] INFO CommonRdbmsReader$Task - Begin to read record by Sql: [select * from sys_user] jdbcUrl:[jdbc:mysql://localhost:3306/bdc_asis?useUnicode=true&characterEncoding=utf8&yearIsDateType=false&zeroDateTimeBehavior=convertToNull&tinyInt1isBit=false&rewriteBatchedStatements=true].
2019-05-17 08:21:40.808 [0-0-0-reader] INFO CommonRdbmsReader$Task - Finished read record by Sql: [select * from sys_user] jdbcUrl:[jdbc:mysql://localhost:3306/bdc_asis?useUnicode=true&characterEncoding=utf8&yearIsDateType=false&zeroDateTimeBehavior=convertToNull&tinyInt1isBit=false&rewriteBatchedStatements=true].
2019-05-17 08:21:40.960 [taskGroup-0] INFO TaskGroupContainer - taskGroup[0] taskId[0] is successed, used[203]ms
2019-05-17 08:21:40.960 [taskGroup-0] INFO TaskGroupContainer - taskGroup[0] completed it’s tasks.
2019-05-17 08:21:50.746 [job-0] INFO StandAloneJobContainerCommunicator - Total 13 records, 1545 bytes | Speed 154B/s, 1 records/s | Error 0 records, 0 bytes | All Task WaitWriterTime 0.000s | All Task WaitReaderTime 0.000s | Percentage 100.00%
2019-05-17 08:21:50.747 [job-0] INFO AbstractScheduler - Scheduler accomplished all tasks.
2019-05-17 08:21:50.747 [job-0] INFO JobContainer - DataX Writer.Job [mysqlwriter] do post work.
2019-05-17 08:21:50.748 [job-0] INFO JobContainer - DataX Reader.Job [mysqlreader] do post work.
2019-05-17 08:21:50.748 [job-0] INFO JobContainer - DataX jobId [0] completed successfully.
2019-05-17 08:21:50.749 [job-0] INFO HookInvoker - No hook invoked, because base dir not exists or is a file: /usr/local/datax/hook
2019-05-17 08:21:50.750 [job-0] INFO JobContainer -
[total cpu info] =>
averageCpu | maxDeltaCpu | minDeltaCpu
-1.00% | -1.00% | -1.00%
[total gc info] =>
NAME | totalGCCount | maxDeltaGCCount | minDeltaGCCount | totalGCTime | maxDeltaGCTime | minDeltaGCTime
PS MarkSweep | 0 | 0 | 0 | 0.000s | 0.000s | 0.000s
PS Scavenge | 0 | 0 | 0 | 0.000s | 0.000s | 0.000s
2019-05-17 08:21:50.751 [job-0] INFO JobContainer - PerfTrace not enable! 2019-05-17 08:21:50.751 [job-0] INFO StandAloneJobContainerCommunicator - Total 13 records, 1545 bytes | Speed 154B/s, 1 records/s | Error 0 records, 0 bytes | All Task WaitWriterTime 0.000s | All Task WaitReaderTime 0.000s | Percentage 100.00% 2019-05-17 08:21:50.752 [job-0] INFO JobContainer -
任务启动时刻 : 2019-05-17 08:20:23
任务结束时刻 : 2019-05-17 08:21:50
任务总计耗时 : 87s
任务平均流量 : 154B/s
记录写入速度 : 1rec/s
读出记录总数 : 13
读写失败总数 : 0
注意 有几点需要注意: 1.账户密码不能错。
2.这个是mysql到mysql,不需要引用其他的插件,如果你是sqlserver或者oracle需要自己下载一下插件或者查一下资料。sqlsercer插件sqljdbc_6.0.8112.100_enu.tar.gz驱动:wget download.microsoft.com/download/0/…
解压并把sqljdbc42.jar文件移至/usr/local/datax/lib目录下,并授权
#tar -xf sqljdbc_6.0.8112.100_enu.tar.gz
#mv /sqljdbc_6.0/enu/jre8/sqljdbc42.jar /usr/local/datax/lib/
#chmod 755 /usr/local/datax/lib/sqljdbc42.jar data:image/gif;base64,R0lGODlhAQABAPABAP///wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw
== 还需要注意:数据库授权可以远程访问。如果遇到java.sql.SQLException:null, message from server: "Host ‘xxxxx’ is not allowed to connect.基本即使没授权。
进入mysql use mysql; 回车,
在输入 : show tables;
输入: select host from user;
在输入: update user set host =’%’ where user =‘root’;
千万不要忘记刷新授权!千万不要忘记刷新授权!千万不要忘记刷新授权!
刷新权限
FLUSH PRIVILEGES
定时脚本
定时脚本编写需要注意,我们可能要好多json需要操作这样就会写好多的定时脚本,这样有点笨。我们可以采用写一个shell然后启动多个json,这样比较方便一些
#!/bin/bash
#一定要写这个,声明你的环境变量
source /etc/profile
/usr/local/datax/bin/datax.py /usr/local/jobs/sys_user1.json " >>/usr/local/datax_log/sys_user1.date +%Y%m%d 2>&1 &
/usr/local/datax/bin/datax.py /usr/local/jobs/sys_user2.json " >>/usr/local/datax_log/sys_user2.date +%Y%m%d 2>&1 &
/usr/local/datax/bin/datax.py /usr/local/jobs/sys_user3.json " >>/usr/local/datax_log/sys_user3.date +%Y%m%d 2>&1 &
data:image/gif;base64,R0lGODlhAQABAPABAP///wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==
然后写个定时任务
$ crontab -e#一分钟执行一次脚本 */1 * * * * /user/local/dataX3.0.sh >/dev/null 2>&1
我是定时每分钟跑一次脚本, 注意一定要处理输入文件,因为cron会见执行情况通过mail发给用户,时间长系统会爆炸掉的哦
性能测试
1、2 0 万条数据,缓存大小设置1 0M ,channel设置为1
c pu 占1. 3 %,内存占0. 1 %,耗时4 1 s。
c pu 占1. 3 %,内存占0. 1 %,耗时4 1 s。
3、1万条记录, ,缓存大小设置1 0M ,channel设置为 5
c pu 占1. 3 %,内存占0. 1 %,耗时 11 s。
先行a表进行查询,然后insert 到另一张表。就是这么简单