开发工具与环境参数:
Windows环境:IDEA、JDK1.8、Maven3.6.0、Python 2.7.16
Linux环境:MySQL5.7.25(部署在两台虚拟机)
一、环境准备
windows版的Python的安装和环境参数配置,参考 https://www.runoob.com/python/python-install.html,很详细。jdk和maven的不做赘述。
二、datax编译
从 https://github.com/alibaba/DataX 将代码下载到本地
datax代码pom文件的版本参数为1.6或1.7,根据本地的jdk环境,全部修改为实际的版本号。
通过maven打包命令(跳过test测试)
mvn -U clean package assembly:assembly -Dmaven.test.skip=true
2.1 报错:Failed to execute goal on project odpsreader: Could not resolve dependencies for project com.alibaba.datax:odpsreader:jar:0.0.1-SNAPSHOT: Could not find artifact com.alibaba.external:bouncycastle.provider:jar:1.38-jdk15 in nexus -> [Help 1]
odpsreader模块引用的包报错
解决:odpsreader和odpswriter模块下的pom文件,将odps-sdk-core的版本都修改为0.20.7-public
2.2 报错:Failed to execute goal on project otsstreamreader: Could not resolve dependencies for project com.alibaba.datax:otsstreamreader:jar:0.0.1-SNAPSHOT: Could not find artifact com.aliyun.openservices:tablestore-streamclient:jar:1.0.0-SNAPSHOT in nexus () -> [Help 1]
解决方法:otsstreamreader模块下的pom文件,修改tablestore-streamclient的版本,将-SNAPSHOT去掉
编译成功后,会在代码所在总目录DataX下生成target文件夹
将要用到的datax.py文件在目录D:\myCode\DataX\target\datax\datax\bin下,要创建的.json文件,将放在D:\myCode\DataX\target\datax\datax\job目录下。
三、使用datax,实现两个Mysql数据库中的数据同步功能
3.1 创建表,初始化数据
在其中一台服务器中数据库mytest创建表student,另一台服务器中数据库mytesttest创建表Z_TEST。表student的字段及初始化数据如下:
表Z_TEST的字段如下:
3.2 创建json文件,内容如下:
{
"job": {
"setting": {
"speed": {
"byte":10485760
},
"errorLimit": {
"record": 0,
"percentage": 0.02
}
},
"content": [
{
"reader": {
"name": "mysqlreader",
"parameter": {
"column" : ["username","age","7","isStudent"],
"connection": [
{
"table": [
"student"
],
"jdbcUrl": [
"jdbc:mysql://192.168.xxx.xx8:3306/mytest?characterEncoding=utf8"
]
}
],
"password": "123",
"username": "test01",
"where": "1=1"
}
},
"writer": {
"name": "mysqlwriter",
"parameter": {
"column" : ["usernm","age","class","isStu"],
"connection": [
{
"table": [
"Z_TEST"
],
"jdbcUrl": "jdbc:mysql://192.168.xxx.xx9:3306/mytesttest?characterEncoding=utf8"
}
],
"password": "123",
"username": "test01"
}
}
}
]
}
}
说明:该json文件只同步部分字段(4个,且将常量7同步到Z_TEST表中的class)的值
可详细参考datax代码中的dataxPluginDev.md文件、mysqlreader.md、mysqlwriter.md文件。需要特别注意的是,在reader中的jdbcUrl可配置多个(格式为数组[]),在writer中的jdbcUrl只能配置一个数据源,即必须写为字符串格式。reader和writer可进行部分同步,但不管全部同步还是部分同步,两者的column中的字段数量必须一致。可以将常量值,作为同步到writer中的某字段的数值,可在reader中的column中填写,若为字符串,需加单引号。当writer的数据表的数值,需要来自reader中的多张表时,可以在reader中使用querySql方式。请详细阅读相关的.md文件。
3.3 java测试代码
package com.alibaba.datax.plugin.reader.mysqlreader;
import java.io.BufferedReader;
import java.io.File;
import java.io.IOException;
import java.io.InputStreamReader;
/**
* @author
* @date 2019/8/
**/
public class TestMysql {
// datax.py的全路径
private static String dataxPath = "D:\\myCode\\DataX\\target\\datax\\datax\\bin\\datax.py";
// json文件路径
private static String jsonPath = "D:\\myCode\\DataX\\target\\datax\\datax\\job\\";
// python可执行文件 pytho.exe的全路径
private static String pythonPath = "D:\\Program Files\\Python\\python.exe";
public static File[] getFileList() {
File file = new File(jsonPath);
File[] files = file.listFiles((File f) -> f.getName().endsWith(".json"));
return files;
}
public static void main(String[] args){
File[] files = getFileList();
for (File f : files) {
// 注意变量间有一个空格
String cmd = pythonPath + " " + dataxPath + " " + f.getAbsolutePath();
try {
Process process = Runtime.getRuntime().exec(cmd);
BufferedReader in = new BufferedReader(new InputStreamReader(process.getInputStream(), "utf-8"));
String line = null;
while ((line = in.readLine()) != null) {
System.out.println(line);
}
in.close();
process.waitFor();
} catch (IOException | InterruptedException e) {
e.printStackTrace();
}
}
}
}
3.4 执行结果
------end-line----