前言
DataX 是阿里巴巴集团内被广泛使用的离线数据同步工具/平台,实现包括 MySQL、Oracle、SqlServer、Postgre、HDFS、Hive、ADS、HBase、TableStore(OTS)、MaxCompute(ODPS)、DRDS 等各种异构数据源之间高效的数据同步功能。
DataX本身作为数据同步框架,将不同数据源的同步抽象为从源头数据源读取数据的Reader插件,以及向目标端写入数据的Writer插件,理论上DataX框架可以支持任意数据源类型的数据同步工作。同时DataX插件体系作为一套生态系统, 每接入一套新数据源该新加入的数据源即可实现和现有的数据源互通。
安装
一、下载
GitHub方式:https://github.com/alibaba/DataX
或者
二、解压
注意: dataX需要在jdk1.8
及Python2.0
以上运行
查询jdk
# java -version
查询Python
# python --version
- 我把刚刚下载的压缩文件放在了
/usr/local/datax
- 解压到
/opt/software
# tar -zxvf datax.tar.gz -C /opt/software
三、验证解压
# bin/datax.py job/job.json
安装完成。
数据同步
这里我以从SqlServer数据库中的一张表数据同步到MySQL中为例讲解一下数据同步功能。
一、datax.py
首先需要说明一下这里的操作原理,建议看一下方便理解。如果想直接实操的可以跳过【一、】这个步骤。
在刚刚我们执行的# bin/datax.py job/job.json
命令中分为两个步骤,第一个是启动名为datax.py
的Python
脚本。第二个是通过datax.py
脚本来执行一个job.json
文件。
datax.py
脚本就不多说了,大家可以打开自己看看。主要我们要知道的是job.json
文件,该文件也是我们用于进行数据同步功能的主要配置文件。
job.json
文件内容:
{
"content":[
{
"reader":{
"name":"streamreader",
"parameter":{
"column":[
{
"type":"string",
"value":"DataX"
},
{
"type":"long",
"value":19900604
},
{
"type":"date",
"value":"1990-06-04 00:00:00"
},
{
"type":"bool",
"value":true
},
{
"type":"bytes",
"value":"test"
}
],
"sliceRecordCount":100000
}
},
"writer":{
"name":"streamwriter",
"parameter":{
"encoding":"UTF-8",
"print":false
}
}
}
],
"setting":{
"errorLimit":{
"percentage":0.02,
"record":0
},
"speed":{
"byte":10485760
}
}
}
解析(个人理解,非官方语言):
content
: 一个执行同步的单元,里面包含读与写操作。
writer
: 写操作的配置信息
reader
:读操作的配置信息
parameter
: 读操作中的数据源
sliceRecordCount
:读取的数据条数
name
:官方描述为数据插件。其实就是使用每一种类型数据库时调用的包也是GitHub页面中这些插件包。
咱们现在使用的就是我标红的这两个,如果需要使用其他数据源比如MySQL和SqlServer,就需要替换相对应的插件包,我们可以在GitHub中找到该包的写入与写出代码
speed
:这里面有个channel
参数为整数,代表并发数量
setting
: 对上面执行单元的基本设置
看完上面配置文件的解释大家应该可以明白,数据同步的规则就是配置一个读入数据源一个写出数据源,执行之后即可进行数据同步。
二、准备数据
- 在一个SqlServer中创建数据名称为datax_read
ps:这张表中ID需要为主键
- 在一个MySQL中创建一个结构相同的表
三、编写job.json
文件
- 回到用户文件下创建
json
文件夹
2. 进入json
文件夹创建steamSqlServerMysql.json
内容如下(账号密码地址请替换成你自己的数据库):
{
"job": {
"content": [{
"reader": {
"name": "sqlserverreader",
"parameter": {
"username": "root",
"password": "root",
"column": [
"ID",
"WTDBH"
],
"splitPk": "ID",
"connection": [{
"table": [
"ERP_CGDD"
],
"jdbcUrl": [
"jdbc:sqlserver://172.16.156.200:1433;DatabaseName=datax_read"
]
}]
}
},
"writer":{
"name": "mysqlwriter",
"parameter": {
"writeMode": "insert",
"username": "root",
"password": "root",
"column": [
"ID",
"WTDBH"
],
"session": [
"set session sql_mode='ANSI'"
],
"preSql": [
"delete from erp_cgdd"
],
"connection": [
{
"jdbcUrl": "jdbc:mysql://172.16.156.201:3306/datax_writer?useUnicode=true&characterEncoding=utf-8",
"table": [
"erp_cgdd"
]
}
]
}
}
}],
"setting": {
"speed": {
"channel": "1"
}
}
}
}
SqlServer读取插件中字段的解释:点击这里
MySQL写入插件中字段的解释:点击这里
四、执行同步操作
# /opt/software/datax/bin/datax.py ./steamSqlServerMysql.json
查询结果
数据同步功能完成!
java通过调用Python脚本执行DataX
原理实际上没区别,直接用java输入刚刚自己在命令行中输入的命令即可
下面代码是java执行Linux命令
try {
String[] cmd = new String[] { "/bin/sh", "-c", "/opt/software/datax/bin/datax.py ./steamSqlServerMysql.json" };
Process ps = Runtime.getRuntime().exec(cmd);
BufferedReader br = new BufferedReader(new InputStreamReader(ps.getInputStream()));
StringBuffer sb = new StringBuffer();
String line;
while ((line = br.readLine()) != null) {
sb.append(line).append("\n");
}
String result = sb.toString();
logger.info(result);
} catch (Exception e) {
logger.error("----error-----");
e.printStackTrace();
}
如果觉得有帮助的话给个免费的点赞吧,Thanks♪(・ω・)ノ