Spring Boot整合DataX同步数据

Spring Boot整合DataX同步数据

我们系统的基础数据存放在EBS中,的有个基础数据同步功能,因为变化频率比较低,所以采用定时加手动的方式同步,每日凌晨三点由ETL工具同步到我们中间表,然后存储过程再处理数据。手动则是程序调用Kettle脚本同步数据到中间表没然后执行存储过程。刚开始上线时,量较小,也就几万条数据,手动同步比较快,越到后期,数据量逐渐增多,达到一百多万的基础数据,通过Kettle同步一次得花十多分钟。业务方实在无法忍受,要求我们必须优化。

当初使用Kettle的原因是处于简单、易操作,通过可视化界面先设计好脚本,获取到ktr的脚本文件,然后在程序中引入kettle-enginemetastorekettle-core这三个kettle相关的包即可在Java程序中执行kettlektr脚本。当数据量上来后,Kettle确实有些力不从心了,所以,我们就换成了阿里开源的DataX。那我们就来尝试下如何整合到程序中吧?

我这边的编译环境是:Windows10JDK1.8Apache Maven 3.6.3,运行环境是Linux version 3.10.0-957.el7.x86_64 ,Python为Linux自带的2.7.5,JDK为1.8。

先去Github下载源码到本地使用mvn -U clean package assembly:assembly -Dmaven.test.skip=true进行编译.

编译好的压缩包有1.32GB,我们将其上传到服务器上。上传后解压,如果本机有Python环境,则不需上传。先用Python生成同步脚本模版,python datax.py -r {YOUR_READER} -w {YOUR_WRITER},我这里是从OracleOracle,进入到datax->bin目录中执行如下脚本:

1
python datax.py -r oraclereader -w oraclewriter > oracleetl.json

最终会生成如下模版,

我们根据自己的情况,修改即可。接下来,就是在Spring Boot中调用DataX来同步数据了。首先引入Jar

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
<dependency>
<groupId>com.alibaba.datax</groupId>
<artifactId>data-common</artifactId>
<version>0.01-SNAPSHOT</version>
<scope>system</scope>
<systemPath>${project.basedir}/src/main/webapp/WEB-INF/lib/datax-common-0.0.1-SNAPSHOT.jar</systemPath>
</dependency>
<dependency>
<groupId>com.alibaba.datax</groupId>
<artifactId>data-core</artifactId>
<version>0.01-SNAPSHOT</version>
<scope>system</scope>
<systemPath>${project.basedir}/src/main/webapp/WEB-INF/lib/datax-core-0.0.1-SNAPSHOT.jar</systemPath>
</dependency>
<dependency>
<groupId>com.alibaba.datax</groupId>
<artifactId>data-transformer</artifactId>
<version>0.01-SNAPSHOT</version>
<scope>system</scope>
<systemPath>${project.basedir}/src/main/webapp/WEB-INF/lib/datax-transformer-0.0.1-SNAPSHOT.jar</systemPath>
</dependency>
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-cli</artifactId>
<version>1.2</version>
<scope>system</scope>
<systemPath>${project.basedir}/src/main/webapp/WEB-INF/lib/commons-cli-1.2.jar</systemPath>
</dependency>

由于DataX相关的包在Maven仓库中不存在,那么只有上传到个人仓库或者直接引用本地包,我选择了后者,这几个包在编译好的datax目录中可以找到。接下来,我们编写调用代码:

1
2
3
4
5
6
7
8
9
System.setProperty("datax.home", DATAX_HOME); //设置datax.home路径,如我们编译的F:/DataX-master/target/datax/datax
String[] itemDatxArgs = {"-job", DATAX_HOME+"/etl_itemdata.json", //etl 作业json配置路径
"-mode", "standalone",
"-jobid", "-1"};
try {
Engine.entry(itemDatxArgs);
} catch (Throwable tb) {
log.error("DataX执行异常:\n" + ExceptionTracker.trace(tb));
}

我来看一下运行效果:

1
2
3
4
5
6
7
8
11:26:51 [job-0] INFO  c.a.datax.core.job.JobContainer - 
任务启动时刻 : 2022-09-26 11:25:51
任务结束时刻 : 2022-09-26 11:26:51
任务总计耗时 : 60s
任务平均流量 : 2.33MB/s
记录写入速度 : 22254rec/s
读出记录总数 : 1335288
读写失败总数 : 0

可以看到1335288条数据,60秒便同步完成。相较之前的Kettle,同步速度提升了8-10倍,而且,可以按不同组织进行同步,每个组织的数据最多也就十多万,通过DataX同步也就十几秒,业务也能够接受这个速度。为什么非要把Kettle换为DataX,这就是我自身原因,不知如何对Kettle进行调优来提升同步速度,有经验的朋友还请告知。

Spring Boot整合DataX同步数据

https://blogs.52fx.biz/posts/2155649479.html

作者

eyiadmin

发布于

2022-09-26

更新于

2024-05-31

许可协议

评论