前言

在用dataX一段时间后,还是想去了解一下它的具体原理,读源码还是得做一些笔记,可能我写的不是很好,如果有写错的话,还请大家多多指教。

开始准备

首先在阅读源码之前,需要先把DataX的源码clone下来,然后再用maven来进行打包,我这边的话在准备时也遇到一些jar找不到的问题,如果有需要的jar包的话,可以在下面提出来,我这边就放一个stream的jar包就好。

git clone https://github.com/alibaba/DataX.git

然后再IDEA里面打开,然后,在datax-all使用maven进行打包,选择clean和package两个选项,进行打包

然后在core部分就可以看到打包出来了,我们可以将这个文件拷出来,然后再新建一个目录plugin文件,再建两个子目录,然后把相应需要的writer和reader的jar添加到相应的文件夹下。

完成上面后,我们需要修改一些配置文件,首先需要修改core.json,位于core打包出来的conf文件夹里面,byte不能设为-1

添加需要的jar包,我把stream的jar放在下面的链接中了。

运行配置

需要的配置,将你的配置文件位置设置出来和你刚刚打包出来的dataX的位置,我们的是放在E盘

-Ddatax.home=E:/datax

-mode standalone -jobid -1 -job E:/datax/job/job.json

然后点击运行就可以查看到结果了。

开始运行

首先我们从Engine主类,位于datax-core包下面,java包下面,我们可以找到入口Engine类

我们先从args获取到我们输入 的参数。

public static void main(String[] args) throws Exception {
int exitCode = 0;
try {
Engine.entry(args);
} catch (Throwable e) {
exitCode = 1;
LOG.error("\n\n经DataX智能分析,该任务最可能的错误原因是:\n" + ExceptionTracker.trace(e)); if (e instanceof DataXException) {
DataXException tempException = (DataXException) e;
ErrorCode errorCode = tempException.getErrorCode();
if (errorCode instanceof FrameworkErrorCode) {
FrameworkErrorCode tempErrorCode = (FrameworkErrorCode) errorCode;
exitCode = tempErrorCode.toExitValue();
}
} System.exit(exitCode);
}
System.exit(exitCode);
}

通过ConfigParser来进行job.json的解析,先从参数中获取到工作文件的路径,然后再通过FileUtils.readFileToString部分读入job.json配置文件

 // 如果用户没有明确指定jobid, 则 datax.py 会指定 jobid 默认值为-1
String jobIdString = cl.getOptionValue("jobid");
RUNTIME_MODE = cl.getOptionValue("mode") ;
// jobPath是job.json的配置路径
Configuration configuration = ConfigParser.parse(jobPath);

然后在ConfigParser.java中将配置文件读入进来,获取到我们从json中提交的content部分和settings

这里它是怎么获取这些配置呢,package com.alibaba.datax.core.util.container.CoreConstant中会中会有一些全局的变量配置,我列举一些出来

// reader 的名称
public static final String DATAX_JOB_CONTENT_READER_NAME = "job.content[0].reader.name";
// reader的参数
public static final String DATAX_JOB_CONTENT_READER_PARAMETER = "job.content[0].reader.parameter";
// writer的名称
public static final String DATAX_JOB_CONTENT_WRITER_NAME = "job.content[0].writer.name";
// writer的参数
public static final String DATAX_JOB_CONTENT_WRITER_PARAMETER = "job.content[0].writer.parameter";

获取到需要的reader和writer参数,通过官方的注释我们也可以看出这里是为了获取对应插件的名称,我们提交的官方的一个demo,所以这里获取到的也是我们定义的streamreader和streamwriter

获取到配置文件后,下面就用doValidate来校验这个这些配置文件

下面为Validate的内容,这里看到都是空的,这个是为什么,因为我们的是stream流,限制不多,如果是在前面是涉及采集其他数据库的话,可能这里就需要校验一些配置是否合理了。

校验好配置文件后,调用start方法,开始进行容器执行,首先先判断是不是一个job文件,然后如果是job的话,就启动一个JobContainer,否则就启动一个TaskGroupContainer,在获取到需要的配置后,就调用一个start方法,执行这个容器。

从下面这张图可以看出,我们提交的配置文件信息都保存到这个configuration这个配置对象中了。

JobContainer

JobContainer主要有以下的过程

  1. doPrepare,首先需要先处理前操作,

  2. init,初始化Reader和Writer,先Reader再Writer

  3. prepare

  4. split

  5. scheduler

1.进入init

初始化Reader和Writer,先是Reader,然后再是Writer, 通过获取到Reader,然后可以

然后解析content里面reader的模块,

调用initReader读取reader配置文件

首先处理好列,可以获取到我们设定列的信息

writer也是同样的道理

prepare

this.prepareJobReader();
this.prepareJobWriter();

prepare阶段需要对数据进行spilt

needChannelNumberByByte =
(int) (globalLimitedByteSpeed / channelLimitedByteSpeed);

计算需要的任务的数量,reader和writer的数量应该是一致的

然后再得出Reader和Writer的分组配置

分割后我们可以看到,任务的reader和writer的信息和对应的TaskId都被整合到一起了。

schedule

这里CoreConstant.DATAX_CORE_CONTAINER_TASKGROUP_CHANNEL,为我们定义的通道的值,如果没有设置就默认设置为5,需要的通道数量就通过一个task的数量和需要通道的数量取一个最小值

post阶段

这个阶段会触发Reader和Writer的post阶段

this.invokeHooks();

打印运行情况

包括Cpu和GC的统计,包括错误记录的条数呀,速度等打印出来。

总结

做一些笔记吧,这样可以可以让自己的印象更加深刻一下,这里并没有详细介绍调度执行的部分,写的比较糙,但是如果一直跟着debug下来还是可以对dataX的源码有一些更加好的理解的。

dataX源码学习的更多相关文章

  1. Java集合专题总结(1):HashMap 和 HashTable 源码学习和面试总结

    2017年的秋招彻底结束了,感觉Java上面的最常见的集合相关的问题就是hash--系列和一些常用并发集合和队列,堆等结合算法一起考察,不完全统计,本人经历:先后百度.唯品会.58同城.新浪微博.趣分 ...

  2. jQuery源码学习感想

    还记得去年(2015)九月份的时候,作为一个大四的学生去参加美团霸面,结果被美团技术总监教育了一番,那次问了我很多jQuery源码的知识点,以前虽然喜欢研究框架,但水平还不足够来研究jQuery源码, ...

  3. MVC系列——MVC源码学习:打造自己的MVC框架(四:了解神奇的视图引擎)

    前言:通过之前的三篇介绍,我们基本上完成了从请求发出到路由匹配.再到控制器的激活,再到Action的执行这些个过程.今天还是趁热打铁,将我们的View也来完善下,也让整个系列相对完整,博主不希望烂尾. ...

  4. MVC系列——MVC源码学习:打造自己的MVC框架(三:自定义路由规则)

    前言:上篇介绍了下自己的MVC框架前两个版本,经过两天的整理,版本三基本已经完成,今天还是发出来供大家参考和学习.虽然微软的Routing功能已经非常强大,完全没有必要再“重复造轮子”了,但博主还是觉 ...

  5. MVC系列——MVC源码学习:打造自己的MVC框架(二:附源码)

    前言:上篇介绍了下 MVC5 的核心原理,整篇文章比较偏理论,所以相对比较枯燥.今天就来根据上篇的理论一步一步进行实践,通过自己写的一个简易MVC框架逐步理解,相信通过这一篇的实践,你会对MVC有一个 ...

  6. MVC系列——MVC源码学习:打造自己的MVC框架(一:核心原理)

    前言:最近一段时间在学习MVC源码,说实话,研读源码真是一个痛苦的过程,好多晦涩的语法搞得人晕晕乎乎.这两天算是理解了一小部分,这里先记录下来,也给需要的园友一个参考,奈何博主技术有限,如有理解不妥之 ...

  7. 我的angularjs源码学习之旅2——依赖注入

    依赖注入起源于实现控制反转的典型框架Spring框架,用来削减计算机程序的耦合问题.简单来说,在定义方法的时候,方法所依赖的对象就被隐性的注入到该方法中,在方法中可以直接使用,而不需要在执行该函数的时 ...

  8. ddms(基于 Express 的表单管理系统)源码学习

    ddms是基于express的一个表单管理系统,今天抽时间看了下它的代码,其实算不上源码学习,只是对它其中一些小的开发技巧做一些记录,希望以后在项目开发中能够实践下. 数据层封装 模块只对外暴露mod ...

  9. leveldb源码学习系列

    楼主从2014年7月份开始学习<>,由于书籍比较抽象,为了加深思考,同时开始了Google leveldb的源码学习,主要是想学习leveldb的设计思想和Google的C++编程规范.目 ...

  10. 【iScroll源码学习04】分离IScroll核心

    前言 最近几天我们前前后后基本将iScroll源码学的七七八八了,文章中未涉及的各位就要自己去看了 1. [iScroll源码学习03]iScroll事件机制与滚动条的实现 2. [iScroll源码 ...

随机推荐

  1. Apache Ranger系列七:Hive 和 Spark 执行过程中的文件路径配置

    背景:在使用Ranger鉴权的过程中,要求必须开启impersonation功能(即执行用户与提交用户保持一致,而不是统一代理的hive/spark).但是在执行的过程中,会需要在hdfs存储临时的文 ...

  2. Json对象转换模块(自编代码JsonObject.cs)

    namespace 信息采集系统.Common { /// <summary> /// Json类型对象,用于其它Json对象继承 /// </summary> /// < ...

  3. PHP 二维按照某个字段对数组排序

    function arraySort($arr, $keys, $type = 'asc') {//二维按照某个字段对数组排序 $keysvalue = $new_array = array(); f ...

  4. [UnityAI]行为树的中断机制

    参考链接: https://www.cnblogs.com/01zxs/p/9863715.html https://blog.csdn.net/AcmHonor/article/details/12 ...

  5. WIn环境基于vs编辑器,Qt应用申请管理员权限的解决方法(转载)

    原文章地址:https://blog.csdn.net/weixin_38416696/article/details/103879377 基本按照那个文章的操作.基本可以了. 唯一问题就是那个vs的 ...

  6. 第二章启动引导器GRUB2

    第二章启动引导器GRUB2grub的配置文件路径:vim /boot/grub2/grub.cfg (不建议直接编辑)vim /etc/default/grub (可编辑的文件)将编辑的操作刷新到/b ...

  7. PHP文件及运行(适合PHP初学者)

    PHP文件可包含HTML.JavaScript代码和 PHP代码,换句话说PHP 代码可以嵌入HTML文档.PHP文件名以php为后缀. PHP代码以"<?php"开头,以& ...

  8. 学会规则引擎Drools,让你早点下班

    前言 现在有这么个需求,网上购物,需要根据不同的规则计算商品折扣,比如VIP客户增加5%的折扣,购买金额超过1000元的增加10%的折扣等,而且这些规则可能随时发生变化,甚至增加新的规则.面对这个需求 ...

  9. Solon2 分布式事件总线的技术价值?

    分布式事件总线在分布式开发(或微服务开发)时,是极为重要的架构手段.它可以分解响应时长,可以削峰,可以做最终一致性的分布式事务,可以做业务水平扩展. 1.分解响应时长 比如我们的一个接口处理分为四段代 ...

  10. Javaweb学习笔记第十六弹--Vue、Element

    Vue(一套前端框架,MVVM主要用于实现数据的双向绑定) Vue快速入门 //新建HTML页面,引入Vue.js文件 <script src="js.Vue.js"> ...