运行
cd {YOUR_DATAX_HOME}/bin
python datax.py {YOUR_JOB.json}
debug
- 下载DataX源码
- 打包
mvn -U clean package assembly:assembly -Dmaven.test.skip=true
生成出目录 x:\projects\DataX\target\datax, 下面包含工作目录datax, 此时会发现少python启动文件,从5.13服务器拷贝 /opt/soft/datax/bin 目录到工作目录datax下
-
定制
json
配置文件 -
启动调试 命令行进入D:\projects\DataX\target\datax\datax\bin目录,调用命令
python datax.py D:\projects\DataX\target\datax\datax\bin\json\hive_to_mysql_staticinfo_maintence_add_test.json -d
, 在调试选项模式启动,-d
代表调试模式 -
idea 运行调试 创建远程调试配置
java程序的入口在Engine.java,可以考虑在其main方法中下断点,开始调试
- 后续操作 1、上面已经生成好了x:\projects\DataX\target\datax目录的工作文件,当需要更新其他插件代码时,在项目中更新,然后直接在对应插件的项目目录下进行mvn package打包,生成对应的插件jar包,然后直接将jar拷贝到x:\projects\DataX\target\datax工作目录下,响应的位置处,然后按照正常调试步骤调试即可
框架总结
设计思想
DataX采用Framework
+ plugin
架构构建,将数据源读取和写入抽象成为Reader/Writer
插件,纳入到整个同步框架中。
运行流程解析
重要的类、方法
JobContainer
core
模块中最重要的类。它是所有任务的 master
,负责初始化、拆分、调度、运行、回收、监控和汇报。但它并不做实际的数据同步操作。
成员变量
// 可以观察一下,他的部分成员变量
private ClassLoaderSwapper classLoaderSwapper = ClassLoaderSwapper
.newCurrentThreadClassLoaderSwapper();
private long jobId;
private String readerPluginName;
private String writerPluginName;
/**
* reader和writer jobContainer的实例
*/
private Reader.Job jobReader;
private Writer.Job jobWriter;
总体运行流程
//从源码中截取,去除debug输出
userConf = configuration.clone();
this.preHandle();
this.init();
this.prepare();
this.schedule();
this.post();
this.postHandle();
split
它会计算作业需要的 channel
数目及将作业拆分成多个task
。
- 划分的首要是确认
needchannelNumber
(需要使用的线程总数)。你可以在配置文件中配置byte
、record
或者channel
来调整 needchannelNumber。如果你使用 byte或record方式,则也必须配置 单通道的最大byte或record大小,通过公式 通道数量 = 全局速度/单通道最高速度。如果两者都配置了,则通过计算之后,谁的 needchannelNumber 小就采用何种方式。如果前两者都未配置,则由配置项 channel 决定。如果channel都不存在,则直接报异常 - 计算得到的 needChannelNumber 并不代表最终的作业切分数目,其最终还是由
reader
插件的来实现作业的具体切分,框架只给一个建议切分的任务数。 - MysqlReader 采用调用 CommonRdbmsReader的
splite
方法 - 当读插件计算后,写插件必须使用相同的
taskNumber
,以保证1:1
的通道模型。
参考
https://blog.csdn.net/qq_39668099/article/details/124254656
https://yanglinwei.blog.csdn.net/article/details/122584478