DataX 是阿里巴巴集团内被广泛使用的离线数据同步工具/平台,实现包括 MySQL、Oracle、SqlServer、Postgre、HDFS、Hive、ADS、HBase、TableStore(OTS)、MaxCompute(ODPS)、DRDS 等各种异构数据源之间高效的数据同步功能。
DataX安装部署
下载完毕后解压缩,长这样:
进入plugin/reader文件夹,看有没有这些文件,有就删除,不然报错。
同理,进入plugin/writer文件夹,删除以下文件:
进入bin文件夹,记事本打开datax.py文件,找到print语句,看看是
print 'xxxxx'
还是
print('xxxxx')
如果是前者,说明需要python2.x环境,如果是后者,则是python3.x的环境,然后去python官网下载对应的python版本,下载完安装。
ps,如果电脑里已经安装了python3.x,但是下载的datax需要的是python2.x,又不想卸载原来的python3.x,怎么办?
这么办,改环境变量:
把python2.x需要的环境变量配到3.x上面,保存,然后去cmd验证一下:
回到datax的目录,进入bin文件夹,在文件夹上面的地址栏里敲cmd,而后输入:
python datax.py -r {your_reader} -w {your_writer}
比如,我有两个数据库,一个是mysql一个是oracle,我要把mysql数据库里的某个表里的内容,复制到oracle里,我就输入:
python datax.py -r mysqlreader -w oraclewriter
不会拼写或者懒得拼写的(比如我),去plugin/reader,plugin/writer里复制。
而后,敲回车,出来这个:
把红框的代码复制,建一个后缀名是.json的文件存起来,名字随便什么都行,但后缀名一定是.jxon。比如我叫它job_mysql_oracle.json。放在bin文件夹里。
然后,改这些内容。
如果是mysql数据库,jdbcUrl那里,后面要填useSSL=false,否则报错。
填完继续放在bin目录下,在cmd里写:
python datax.py {your_job}
比如,我刚才建的job名字是job_mysql_oracle.json,那就写:
python datax.py job_mysql_oracle.json
回车,画面长这样:
先别管乱码的事,先去数据库看一眼,嗯,有数据。证明成功了。
下面来解决乱码的事,不乱码可以跳过
在cmd窗口输入:
chcp 65001
来,再走一边刚才的操作:
这说明,DataX本身是通了的。
DataX插件二次开发
我用的是java-spring boot。
首先在datax/lib文件夹里找到这两个jar包
放在项目文件夹里,比如resources/lib文件夹:
打开pom.xml文件,添加这些东西:
<dependency>
<groupId>com.alibaba.datax</groupId>
<artifactId>data-common</artifactId>
<version>0.01</version>
<scope>system</scope>
<systemPath>${project.basedir}/src/main/resources/lib/datax-common-0.0.1-SNAPSHOT.jar</systemPath>
</dependency>
<dependency>
<groupId>com.alibaba.datax</groupId>
<artifactId>data-core</artifactId>
<version>0.01</version>
<scope>system</scope>
<systemPath>${project.basedir}/src/main/resources/lib/datax-core-0.0.1-SNAPSHOT.jar</systemPath>
</dependency>
注意sysPath栏,要填对,不然标红
还要把这些添进去,不然也会报错(心累):
<dependency>
<groupId>commons-cli</groupId>
<artifactId>commons-cli</artifactId>
<version>1.4</version>
</dependency>
<dependency>
<groupId>org.apache.httpcomponents</groupId>
<artifactId>httpclient</artifactId>
<version>4.5.13</version>
</dependency>
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-io</artifactId>
<version>1.3.2</version>
</dependency>
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-lang3</artifactId>
<version>3.12.0</version>
</dependency>
<dependency>
<groupId>commons-lang</groupId>
<artifactId>commons-lang</artifactId>
<version>2.6</version>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.60</version>
</dependency>
效果如下:
重新编译,直到不标红为止。而后,编写如下代码:
String DATAX_HOME = "{你的datax目录(是根目录,下面能找到bin、plugin文件夹的目录)的地址(盘符://文件夹//文件夹那种)}";
System.setProperty("datax.home", DATAX_HOME);
String[] itemDatxArgs = {"-job", DATAX_HOME+"{你放json文件夹的目录名称/文件名(比如:/bin/job_mysql_oracle.json)}", "-mode", "standalone","-jobid", "-1"};
try {
com.alibaba.datax.core.Engine.entry(itemDatxArgs);
} catch (Throwable tb) {
System.out.println("DataX执行异常:\n" +com.alibaba.datax.common.exception.ExceptionTracker.trace(tb));
}
然后执行这个代码,如果你之前的步骤没有问题,那这个代码是没有问题的。
后记:
这个东西本身不难,但因为搜到的教程,作者都是站在自己角度上写的,第一次接触这东西的人,就很难理解,走了不少弯路,堪比过五关斩六将。希望我的这篇拙作,能帮助一些人。