DataX3.0

1,296 阅读5分钟

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 prepare2019-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 split2019-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 schedule2019-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 its 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 到另一张表。就是这么简单