简介
随着业务量的上升,以前的架构已经不满足业务的发展,数据作为业务中最重要的一环,需要有更好的架构作为支撑。目前我司有sql server转mysql的需求,所以结合当前业务,我挑选了阿里云开源的一个很好用的同步工具DataX
DataX介绍
DataX 是一个异构数据源离线同步工具,致力于实现包括关系型数据库(MySQL、Oracle等)、HDFS、Hive、MaxCompute(原ODPS)、HBase、FTP等各种异构数据源之间稳定高效的数据同步功能。
框架设计
datax_framework_newDataX本身作为离线数据同步框架,采用Framework + plugin架构构建。将数据源读取和写入抽象成为Reader/Writer插件,纳入到整个同步框架中。
- Reader:Reader为数据采集模块,负责采集数据源的数据,将数据发送给Framework。
- Writer: Writer为数据写入模块,负责不断向Framework取数据,并将数据写入到目的端。
- Framework:Framework用于连接reader和writer,作为两者的数据传输通道,并处理缓冲,流控,并发,数据转换等核心技术问题。
实战
下载安装部署
$ wget http://datax-opensource.oss-cn-hangzhou.aliyuncs.com/datax.tar.gz
$ tar zxvf datax.tar.gz
$ sudo chmod -R 755 {YOUR_DATAX_HOME}
也可以自己下载源码安装,不过需要安装maven
$ git clone git@github.com:alibaba/DataX.git
$ cd {DataX_source_code_home}
$ mvn -U clean package assembly:assembly -Dmaven.test.skip=true
打包成功后的DataX包位于 {DataX_source_code_home}/target/datax/datax/ ,结构如下:
$ cd {DataX_source_code_home}
$ ls ./target/datax/datax/
bin conf job lib log log_perf plugin
配置
你需要编写一个基本信息配置文件,文件包括原库到写入库的表字段对应关系。基本信息包括
{
"job": {
"content": [
{
"reader": { //读入库配置,比如说是sql server
"name": "", //数据源名称,别瞎写
"parameter": {} //数据库配置信息
},
"writer": { //写入库配置,比如说是mysql
"name": "", //数据源名称,别瞎写
"parameter": {} //数据库配置信息
}
}
],
"setting": { //基本设置
"speed": { //流量控制
"channel": 1, //同步时候的并发数
"byte": 104857600 //同步时候的字节大小,影响速度
},
"errorLimit": { //脏数据控制
"record": 10, //脏数据最大记录数阈值
"percentage": 0.05 //脏数据占比阈值
}
}
}
}
下面给一个配置demo,大家根据自己的需要修改demo,然后使用
{
"job": {
"setting": {
"speed": {
"byte": 1073741824
}
},
"content": [
{
"reader": {
"name": "sqlserverreader",
"parameter": {
"username": "root", //自己根据需要修改数据库用户名
"password": "admin", //密码
"where": "",
"connection": [
{
"querySql": [
"SELECT Id,MyReasonId,MyProductType,MyReason FROM dbo.MyReason WITH ( NOLOCK )"
],//全量sql,根据自己需要写增量sql也可以
"jdbcUrl": [
"jdbc:sqlserver://192.168.1.1:1433;DatabaseName=XXXX"
]//自己根据需要修改数据库连接
}
]
}
},
"writer": {
"name": "mysqlwriter",
"parameter": {
"writeMode": "insert", //写入模式,这里写插入
"username": "root",//自己根据需要修改数据库用户名
"password": "admin",//密码
"column": [
"id", //注意与上面的列一一对应
"my_reason_id",
"my_product_type",
"my_reason"
],
"connection": [
{
"jdbcUrl": "jdbc:mysql://192.168.1.2:3306/XXX?useUnicode=true&characterEncoding=utf-8",
"table": [
"my_reason"
]
}
]
}
}
}
]
}
}
编辑好之后,放到新建work目录里面,然后存为mssql_to_mysql.json,下面就可以运行了
运行
$ cd {YOUR_DATAX_HOME}/bin
$ python datax.py ../work/mssql_to_mysql.json
同步结束,显示日志如下:
...
2015-12-17 11:20:25.263 [job-0] INFO JobContainer -
任务启动时刻 : 2015-12-17 11:20:15
任务结束时刻 : 2015-12-17 11:20:25
任务总计耗时 : 10s
任务平均流量 : 205B/s
记录写入速度 : 5rec/s
读出记录总数 : 50
读写失败总数 : 0
这样就说明成功啦
进阶
job配置
将你需要同步的增量数据放入到安装目录job下面,存为myjob.json,名称随意
linux下通过crontab命令实现
#查看crond服务是否启动,出现以下日志表示已启动
$/sbin/service crond status
crond (pid 30742) is running...
第一步:创建作业的配置文件(json格式) 参考上节内容。这里假设已配置好MySQL到ODPS的配置文件mysql2odps.json
第二步:列出列出crontab文件,命令: crontab -l
(1)若出现以下日志,表示当前用户没有定时任务,用户需要新建crontab文件,并提交crontab文件,参考第三步。$crontab -l
no crontab for xxx
(2)若出现以下日志,表示当前用户已经有正在运行的定时任务,用户只需用命令crontab -e 来编辑crontab文件,参考第四步。 shell $ crontab -l 0,10,20,35,44,50 * * * * python /home/admin/datax3/bin/datax.py /home/admin/mysql2odps.json >>/home/hanfa.shf/log.
date +\%Y\%m\%d\%H\%M\%S2>&1
第三步:若当前用户没有定时任务(之前从未创建过crontab任务)
(1)创建一个新的crontab文件,如取名crondatax
示例1:每天13点5分进行同步作业,并把运行日志输出到目录/home/hanfa.shf/下log.运行时间 文件中,如定时运行是在2016-3-26 13:10:13运行的,产生的日志文件名为:log.20160326131023
$ vim crondatax
#输入以下内容
5 13 * * * python /home/admin/datax3/bin/datax.py /home/admin/mysql2odps.json >>/home/hanfa.shf/log.`date +\%Y\%m\%d\%H\%M\%S` 2>&1
#/home/admin/datax3/bin/datax.py 表示你安装的DataX datax.py所在目录(请替换为您真实的绝对路径目录);
#/home/admin/mysql2odps.json 表示作业的配置文件目录(请替换为您真实的绝对路径目录);
#/home/hanfa.shf/log.`date +\%Y\%m\%d\%H\%M\%S` 表示日志输出位置,并以log.当前时间 命名(请替换为您真实的绝对路径目录)(2)提交你刚刚创建的crontab文件
shell $ crontab crondatax #crondatax 你创建的crontab文件名
(3)重启crontab服务
shell $ sudo /etc/init.d/crond restart Stopping crond: [ OK ] Starting crond: [ OK ]
(4)在13点5分过后,在日志目录会看到对应的日文件
shell $ ls -al /home/hanfa.shf/ -rw-r--r-- 1 hanfa.shf users 12062 Mar 26 13:05 log.20160326130501
第四步:若当前用户已有定时任务(想继续增加定时任务)
(1)编辑已有crontab文件
示例2:每10分钟运行一次同步任务,并把运行日志输出到目录/home/hanfa.shf/下log.运行时间 文件中,如定时运行是在2016-3-26 13:10:13运行的,产生的日志文件名为:log.20160326131023$ crontab -e
#会进入已有crontab文件编辑界面,继续增加定时任务即可,本示例增加以下内容,并保存
0,10,20,30,40,50 * * * * python /home/admin/datax3/bin/datax.py /home/admin/mysql2odps.json >>/home/hanfa.shf/log.`date +\%Y\%m\%d\%H\%M\%S` 2>&1(2)重启crontab服务
$ sudo /etc/init.d/crond restart
(3)用crontab -l 命令检查是否添加成功
$ crontab -l
5 13 * * * python /home/admin/datax3/bin/datax.py /home/admin/mysql2odps.json >>/home/hanfa.shf/log.`date +\%Y\%m\%d\%H\%M\%S` 2>&1
0,10,20,30,40,50 * * * * python /home/admin/datax3/bin/datax.py /home/admin/mysql2odps.json >>/h
进阶内容引自官方教程 ^_^
来源:oschina
链接:https://my.oschina.net/u/4290811/blog/3980039