前言:DataX的简介等这里就不多说了。本文主要记录DataX运行流过程中的主要步骤,通过源码大概过一遍主干部分和过程中的一些重要方法。文章中代码截图都是来自源码,但,基于截图的面积限制,有些代码做了删除,留下了自己认为核心的代码作为讲解参考之用,因此会看到一些变量或方法爆红等情况,请提前知悉。此篇的展示方式和思路也是参考借鉴过别人的文章,借鉴或引用到的文章文后有reference可以参考。希望此篇作为抛砖引玉,期待讨论,指教。
前言言完,进入主题。DataX的入口是Engine这个类,直接进去看它的main方法,开始 …
- Engine入口(com.alibaba.datax.core.Engine)main方法里面执行entry()方法:
- Entry()方法主要做了2件事情,解析生成configration生成一个新的Engine然后启动Engine的start()方法
- ConfigParser.parse()这个方法主要做以下三件事,然后生成一个configration用来执行start()方法:
1) 解析job的配置信息,由启动参数指定job.json文件。
2) 解析DataX自带配置信息,由默认指定的core.json文件。
3) 解析读写插件配置信息,由job.json指定的reader和writer插件信息 - Engine.start()方法主要目的就是启动JobContainer.start()的方法:
- JobContainer.start()方法主要里面主要顺序执行如下图的方法,而最重要的就是 split(), schedule(),先通过文字大致了解下这几个重要方法具体是干嘛的(下面4点随便看一下有个大概印象就行,看完代码再回来总结效果会比较好一点):
1) init()方法:根据configuration信息初始化reader和writer插件,涉及到jar包热加载,并调用插件init()操作方法,最后设置reader和writer的configuration信息。
2)prepare()方法:reader和writer插件的初始化,保存当前classLoader,并将当前线程的classLoader设置为所给classLoader,再将当前线程的类加载器设置为保存的类加载,通过调用插件的prepare()方法实现,每个插件都有自己的jarLoader,通过集成URLClassloader实现而来。
3)split()方法做三件事:
a) 通过adjustChannelNumber()方法调整channel个数;
b) 然后调用插件自己的split()方法,将reader和writer切分,需要注意,writer的切分结果要参照reader的切分结果,达到切分后数目相等,才能满足1:1的通道模型;channel的计数主要是根据byte和record的限速来实现的,在split()的函数中第一步就是计算channel的大小;split()方法reader插件会根据channel的值进行拆分,但是有些reader插件可能不会参考channel的值,writer插件会完全根据reader的插件1:1进行返回;
c) 最后,mergeReaderAndWriterTaskConfigs(),负责合并reader、writer、transformer 并生成t