异构数据源同步之数据同步 → datax 改造,有点意思
开心一刻
去年在抖音里谈了个少妇,骗了我 9 万
后来我发现了,她怕我报警
她把她表妹介绍给我
然后她表妹又骗了我 7 万

DataX
DataX 是什么,有什么用,怎么用
不做介绍,大家自行去官网(DataX)看,Gitee 上也有(DataX)

你们别不服,我这是为了逼迫你们去自学,是为了你们好!
文档很详细,也是开源的,我相信你们都能看懂,也能很快上手用起来
那这篇文章到此结束,大家各自去忙吧
但是等等,我想带你们去改造改造datax
挺有意思的,我们慢慢往下看
去 Python
根据官方的 Quick Start

是依赖 Python 来启动的
$ cd {YOUR_DATAX_HOME}/bin
$ python datax.py {YOUR_JOB.json}
如果要去掉 Python 依赖,你们会怎么做?
是不是梳理清楚 datax.py 的代码逻辑就行了?
datax.py
这个代码不长,但是如果没有一点 Python 底子,datax.py 是看不懂的
所以我们换个方式,去寻找我们需要的信息就行了
DataX 的业务代码是 java 实现的,然后你们再往上看看 System Requirements
你们觉得该如何启动 JVM 进程来执行 DataX 的 java 代码?
是不是只能用 JDK 的 java 命令了?
所以我们直接在 datax.py 中搜索 java 即可
你们会发现只有如下这一行表示 java 命令
ENGINE_COMMAND = "java -server ${jvm} %s -classpath %s ${params} com.alibaba.datax.core.Engine -mode ${mode} -jobid ${jobid} -job ${job}" % (
DEFAULT_PROPERTY_CONF, CLASS_PATH)
Python 中的 % 就相当于 java 中的 String.format 方法

也就说,datax.py 是通过 java -server 命令来启动 JVM 进程的
那么我们是不是可以绕过 Python,直接在 cmd 调用 java -server 来启动了?
java -server
这个命令还真不眼熟,因为我们接触到的往往是 java -jar
我们用 java -h 看下 java 命令的说明

发现了什么?
-server 是 option 之一,与 -jar 并不是 非此即彼 的关系
所以不要去拿 java -server 与 java -jar 做对比了,没意义!!!
在Java中,JVM有两种运行模式:客户端模式和服务器模式。这两种模式是为了优化不同场景下的JVM性能而设计的。
服务器模式:这种模式适用于长时间运行的应用程序,如Web服务器或数据库服务器。服务器模式下的JVM会进行更多的优化,以减少长时间运行的性能开销。例如,它会进行更深入的即时编译(JIT compilation),以提高代码的执行效率。
客户端模式:默认情况下,JVM运行在客户端模式。这种模式适用于较短时间运行的应用程序,如桌面应用或命令行工具。客户端模式下的JVM会更快地启动,但可能不如服务器模式那样高效。
使用-server选项启动JVM时,您告诉JVM在服务器模式下运行。这通常意味着JVM将使用更多的系统资源,但可以提供更好的性能,特别是在长时间运行的应用程序中
我们先下载 DataX 工具包

解压之后,我的 DataX 的根目录是:G:\datax-tool\datax

我们不通过 datax.py 来启动,而是直接在 cmd 下通过 java 命令来启动
java -server -Xms1g -Xmx1g -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=G:\datax-tool\datax\log -Dfile.encoding=GBK -Dlogback.statusListenerClass=ch.qos.logback.core.status.NopStatusListener -Djava.security.egd=file:///dev/urandom -Ddatax.home=G:\datax-tool\datax -Dlogback.configurationFile=G:\datax-tool\datax\conf\logback.xml -classpath G:\datax-tool\datax\lib\* com.alibaba.datax.core.Engine -mode standalone -jobid -1 -job G:\datax-tool\datax\job\job.json
注意:上述 java 命令中的相关路径需要替换成你们自己的路径!
不出意外的话,会执行成功

为什么依赖 Python
如果你们去看了 DataX 工具包的目录结构,或者 DataX 的源码
你们会发现 DataX 就是用 java 实现的,Python 仅仅只是作为一个启动脚本(另外两个脚本你们自己去研究)

仅仅为了一个启动,而这个启动又不是非 Python 不可,就引入了 Python 环境依赖,试问这合理吗?

不要急着下结论,我们理智分析一波
DataX 正式投入使用的时候,会部署到什么系统上,请你们大声的告诉我

不说全部,绝大部分是部署在 Linux 上,对此我相信你们都没异议吧
那么重点来了:目前主流的 Linux 系统,都自带 Python !!!
也就是不用再额外的是安装 Python,直接可以用,那为什么不用呢?
那如果是部署在 Windows 上,而又不想安装 Python,该如何启动了?
如果你们还能问出这样的问题,我只想给你们来上一枪

前面不是刚讲吗,在 cmd 直接用 java 命令来启动 DataX 不就行了?
java 启动 DataX
说的更详细点,是通过 java 代码去启动 DataX 的 JVM 进程
我相信你们都会,直接上代码
private static final String DATAX_COMMAND = "java -server -Xms1g -Xmx1g -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=G:\\datax-tool\\datax\\log -Dfile.encoding=GBK -Dlogback.statusListenerClass=ch.qos.logback.core.status.NopStatusListener -Djava.security.egd=file:///dev/urandom -Ddatax.home=G:\\datax-tool\\datax -Dlogback.configurationFile=G:\\datax-tool\\datax\\conf\\logback.xml -classpath G:\\datax-tool\\datax\\lib\\* com.alibaba.datax.core.Engine -mode standalone -jobid -1 -job G:\\datax-tool\\datax\\job\\job.json";
public static void main(String[] args) {
try {
Process process = Runtime.getRuntime().exec(DATAX_COMMAND);
// 等待命令执行完成
int i = process.waitFor();
if (i == 0) {
System.out.println("job执行完成");
} else {
System.out.println("job执行失败");
}
} catch (Exception e) {
throw new RuntimeException(e);
}
}
是不是很简单?
执行下,你会发现卡住了!!!

出师不利呀,要不放弃?

当 Runtime 对象调用 exec(cmd) 后,JVM 会启动一个子进程,该进程会与 JVM 进程建立三个管道连接:标准输入,标准输出 和 标准错误流
假设子进程不断在向标准输出流和标准错误流写数据,而 JVM 进程不读取的话,当缓冲区满之后将无法继续写入数据,最终造成阻塞在 waitfor()
所以改造下就好了
private static final String SYSTEM_ENCODING = System.getProperty("sun.jnu.encoding");
private static final String DATAX_COMMAND = "java -server -Xms1g -Xmx1g -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=G:\\datax-tool\\datax\\log -Dfile.encoding=GBK -Dlogback.statusListenerClass=ch.qos.logback.core.status.NopStatusListener -Djava.security.egd=file:///dev/urandom -Ddatax.home=G:\\datax-tool\\datax -Dlogback.configurationFile=G:\\datax-tool\\datax\\conf\\logback.xml -classpath G:\\datax-tool\\datax\\lib\\* com.alibaba.datax.core.Engine -mode standalone -jobid -1 -job G:\\datax-tool\\datax\\job\\job.json";
public static void main(String[] args) {
try {
Process process = Runtime.getRuntime().exec(DATAX_COMMAND);
// 另启线程读取
new Thread(() -> {
try (BufferedReader reader = new BufferedReader(new InputStreamReader(process.getInputStream(), SYSTEM_ENCODING))) {
String line;
while ((line = reader.readLine()) != null) {
System.out.println(line);
}
} catch (IOException e) {
throw new RuntimeException(e);
}
}).start();
new Thread(() -> {
try (BufferedReader errorReader = new BufferedReader(new InputStreamReader(process.getErrorStream(), SYSTEM_ENCODING))) {
String line;
while ((line = errorReader.readLine()) != null) {
System.out.println(line);
}
} catch (IOException e) {
throw new RuntimeException(e);
}
}).start();
// 等待命令执行完成
int i = process.waitFor();
if (i == 0) {
System.out.println("job执行完成");
} else {
System.out.println("job执行失败");
}
} catch (Exception e) {
throw new RuntimeException(e);
}
}
还是比较简单的吧,相信你们都能看懂
总结
DataX是进程级别的,而Job下的Task是线程级别的
为什么
DataX要实现成进程级别,而不是线程级别?小数据量的同步,实现方式往往很多
但大数据量的同步,情况就不一样了,那么此时进程和线程的区别还大吗
Linux系统基本自带Python环境,所以大家不要再纠结为什么依赖Python了去掉
Python依赖也很简单,文中已有演示DataX+datax-web这个组合已经基本够用datax-web 基于 XXL-JOB,基本满足我们日常的调度要求了
异构数据源同步之数据同步 → datax 改造,有点意思的更多相关文章
- SQLite与MySQL、SQLServer等异构数据库之间的数据同步
SQLite DBSync是开源嵌入式数据库SQLite的数据同步引擎,实现了SQLite与SQLite数据库之间以及SQLite与异构数据库(Oracle.MySQL.SQLServer)之间的增量 ...
- Navicat premium对数据库的结构同步和数据同步功能
一.在目标数据库新建一个相同的数据库名. 二.工具-->结构同步. 三.填写源数据库和目标数据库. 四.点击比对 五.点击部署 六.点击运行 七.点击关闭.此时源数据库的结构已经同步到目标数据库 ...
- 不同数据源之间的数据同步jdbc解决方案
最近项目中用到的数据要从一个数据源获取存进另一个数据源,简单的jdbc解决方案. package com.sh.ideal.test.syns; import java.sql.Connection; ...
- 环境篇:数据同步工具DataX
环境篇:数据同步工具DataX 1 概述 https://github.com/alibaba/DataX DataX是什么? DataX 是阿里巴巴集团内被广泛使用的离线数据同步工具/平台,实现包括 ...
- 数据同步工具Sqoop和DataX
在日常大数据生产环境中,经常会有集群数据集和关系型数据库互相转换的需求,在需求选择的初期解决问题的方法----数据同步工具就应运而生了.此次我们选择两款生产环境常用的数据同步工具进行讨论 Sqoop ...
- 数据同步Datax与Datax_web的部署以及使用说明
一.DataX3.0概述 DataX 是一个异构数据源离线同步工具,致力于实现包括关系型数据库(MySQL.Oracle等).HDFS.Hive.ODPS.HBase.FTP等各种异构数据源之间稳定高 ...
- 比Sqoop功能更加强大开源数据同步工具DataX实战
@ 目录 概述 定义 与Sqoop对比 框架设计 支持插件 核心架构 核心优势 部署 基础环境 安装 从stream读取数据并打印到控制台 读取MySQL写入HDFS 读取HDFS写入MySQL 执行 ...
- 基于datax的数据同步平台
一.需求 由于公司各个部门对业务数据的需求,比如进行数据分析.报表展示等等,且公司没有相应的系统.数据仓库满足这些需求,最原始的办法就是把数据提取出来生成excel表发给各个部门,这个功能已经由脚本转 ...
- Java多线程初学者指南(9):为什么要进行数据同步
Java中的变量分为两类:局部变量和类变量.局部变量是指在方法内定义的变量,如在run方法中定义的变量.对于这些变量来说,并不存在线程之间共享的问题.因此,它们不需要进行数据同步.类变量是在类中定义的 ...
- Django:(博客系统)使用使用mysql数据&创建post/category/tag实体,并同步到数据中
背景: 之前也读过一些关于django的一些书,看过别人写的一些博客系统.但是总有一种看别人的都会,但自己写不出来的感觉,于是为了加深对django的学习就开始动手学习了. 环境搭建: 环境:使用py ...
随机推荐
- 直播预告丨Hello HarmonyOS进阶系列课程重磅来袭,4月27日开播
为了帮助初识HarmonyOS的开发者快速入门,我们曾推出Hello HarmonyOS系列一共5期课程(传送门:https://developer.huawei.com/consumer/cn/tr ...
- 罗小黑的秘密qsnctfwp
题目的附件 安装相关工具 在 Linux 中使用命令安装 gem :apt-get install gem 在 Linux 中使用命令安装 zsteg :gem install zsteg 这是一道图 ...
- redis 简单整理——开发和运维中的问题[二十四]
前言 简单介绍一下开发和运维中的问题. 正文 从上文中介绍了,我们有了一个副本了,通过复制的方式. 这些副本可以应用于读写分 离.故障转移(failover).实时备份等场景. 那么可以关注一些开发和 ...
- 深度解读《深度探索C++对象模型》之数据成员的存取效率分析(一)
接下来我将持续更新"深度解读<深度探索C++对象模型>"系列,敬请期待,欢迎关注!也可以关注公众号:iShare爱分享,自动获得推文和全部的文章列表. 在<深度解 ...
- MySQL实战—更新过程
和查询流程不同的是,更新流程涉及两个重要的日志模块:redo log(重做日志)和 binlog(二进制日志). redo log redo log通常是物理日志,记录的是数据页的物理修改,而不是某一 ...
- 如何 0 改造,让单体/微服务应用成为 Serverless Application
简介: 随着 2013 年以 Docker 为代表的容器技术.CNCF 基金会以及 K8s 的发展等,云原生开始被广大开发者所熟知.云原生时代之前还有两个阶段:一是自建 IDC 机房,二是简单地把原有 ...
- Fluid 0.5 版本发布:开启数据集缓存在线弹性扩缩容之路
简介: 为了解决大数据.AI 等数据密集型应用在云原生场景下,面临的异构数据源访问复杂.存算分离 I/O 速度慢.场景感知弱调度低效等痛点问题,南京大学PASALab.阿里巴巴.Alluxio 在 2 ...
- 从托管到原生,MPP架构数据仓库的云原生实践
简介:本文介绍了云原生数据仓库产品AnalyticDB PostgreSQL从Cloud-Hosted到Cloud-Native的演进探索,探讨为了实现真正的资源池化和灵活售卖的底层设计和思考,涵盖 ...
- 多任务多目标CTR预估技术
简介: 多目标(Multi Objective Learning)是MTL中的一种.在业务场景中,经常面临既要又要的多目标问题.而多个目标常常会有冲突.如何使多个目标同时得到提升,是多任务多目标在真 ...
- [Blockchain] 以太坊主流测试网 ropsten 和 kovan 的区别 以及 如何选择
ropsten 采用 POW (Proof-of-Work)共识机制,挖矿难度系数非常低,容易被攻击,不够低碳环保. kovan 采用 POA (Proof-of-Authority)共识机制,不需要 ...