datax数据同步:Mysql 2 Mysql 的简单实践(本地windows)(含几个编译报错的解决方法)


本文基于windows环境使用datax,Linux环境下酌情参考。

开发工具与环境参数:

        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数据同步:Mysql 2 Mysql 的简单实践(本地windows)(含几个编译报错的解决方法)_第1张图片

datax代码pom文件的版本参数为1.6或1.7,根据本地的jdk环境,全部修改为实际的版本号。

datax数据同步:Mysql 2 Mysql 的简单实践(本地windows)(含几个编译报错的解决方法)_第2张图片

通过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模块引用的包报错

解决:odpsreaderodpswriter模块下的pom文件,将odps-sdk-core的版本都修改为0.20.7-public

datax数据同步:Mysql 2 Mysql 的简单实践(本地windows)(含几个编译报错的解决方法)_第3张图片

datax数据同步:Mysql 2 Mysql 的简单实践(本地windows)(含几个编译报错的解决方法)_第4张图片


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数据同步:Mysql 2 Mysql 的简单实践(本地windows)(含几个编译报错的解决方法)_第5张图片


编译成功后,会在代码所在总目录DataX下生成target文件夹

datax数据同步:Mysql 2 Mysql 的简单实践(本地windows)(含几个编译报错的解决方法)_第6张图片

将要用到的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的字段及初始化数据如下:

datax数据同步:Mysql 2 Mysql 的简单实践(本地windows)(含几个编译报错的解决方法)_第7张图片

表Z_TEST的字段如下:

datax数据同步:Mysql 2 Mysql 的简单实践(本地windows)(含几个编译报错的解决方法)_第8张图片

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 执行结果

datax数据同步:Mysql 2 Mysql 的简单实践(本地windows)(含几个编译报错的解决方法)_第9张图片

datax数据同步:Mysql 2 Mysql 的简单实践(本地windows)(含几个编译报错的解决方法)_第10张图片

------end-line----

 

你可能感兴趣的:(record)