DataX 3.0 源码解析(一)
基本调用类分析
任务启动由python脚本新建进程进行任务执行,后续执行由Java进行,以下将对java部分进行分
其中的调用原理机制。
Engine
首先入口类为com.alibaba.datax.core.Engine的main方法,其中通过调用其本身的静态方法entry,该方法主要针对输入参入进行格式化以及校验:
BasicParser parser = new BasicParser();
CommandLine cl = parser.parse(options, args);
其中需要注意运行模式是通过RUNTIME_MODE = cl.getOptionValue(“mode”)代码直接赋值给静态变量的,针对命令行参数采用了org.apache.commons的BasicParser解析,针对任务的配置文件则通过其本身的ConfigParser进行解析(可以支持本地和网络文件)。
完成配置初始化后该方法将实例化本身并调用其start方法,将初始化好的配置对象传入其中。该方法首先将类型转换进行初始化,以保证在后续数据导入导出中不兼容类型可以进行顺利的转换工作,具体通过ColumnCast.bind(configuration)方法进行绑定,其中主要针对三种类型进行初始化工作:
StringCast.init(configuration);
DateCast.init(configuration);
BytesCast.init(configuration);
接着就是利用LoadUtil.Bind(pluginCoonfigs)保存插件,便于后续读取插件相关配置信息内容。剩下就是该函数的核心流程,即判断当前的任务运行模式,是TaskGroup还是Job模式。但通过实际分析来看基本都是Job模式,所以后续我们主要以JobContainer为切入点,另一个则为TaskGroupContainer。两者均继承自AbstractContainer基类,并通过调用他们的start方法进行启动。
对于非Standlone模式还支持记录任务进度情况,进行汇报的功能。具体由最后实例化的PerfTrace类实现。
JobContainer
首先该类的构造函数中仅初始化了ErrorRecordChecker类用于检查任务是否到达错误记录限制。而主要的运行则落在了start方法中,细心读者可以发现其中读取了job.setting.dryRun配置参数,判断是否需要执行预检查(preCheck)。正常工作流程则如下所示:
preHandle
Job前置操作,即初始化preHandler插件并执行其preHandler;
AbstractJobPlugin handler = LoadUtil.loadJobPlugin(
handlerPluginType, handlerPluginName);
// todo...
handler.preHandler(configuration);
init
初始化reader和writer,实际方法中根据读写插件各自执行了对应的初始化方法,具体代码如下所示。
this.jobReader = this.initJobReader(jobPluginCollector);
this.jobWriter = this.initJobWriter(jobPluginCollector);
其中各方法均类似,就是读取对应加载对应的插件对象并调用插件对应的方法进行相关配置的设置以及对应方法的初始化,选取initJobReader方法中的部分代码片段如下:
Reader.Job jobReader = (Reader.Job) LoadUtil.loadJobPlugin(
PluginType.READER, this.readerPluginName);