(1)地址:GitHub - alibaba/DataX: DataX是阿里云DataWorks数据集成的开源版本。
(2)介绍的文章就比较多了,在这里想分析一下 具体是如何设计的以及使用到哪些巧妙的设计
1、自定义json的结构,然后映射到Configuration中,通过Configuration中的方法可以方便的获取对应JOB的配置参数,插件的自定义参数,任务的配置参数,
2、插件+框架的组合 实现基本的扩展,为了防止不同组件之间类的隔离,使用自定义类加载器,在jobContainer启动的时候,加载组件使用自定义类加载器URLClassLoader,真正在运行到那些插件的时候,就会使用自定义类加载,这个点设计的很巧妙。目前加载某个插件,不会加载所有的插件,而是懒加载,就是使用某个job使用哪个的时候,发现为空,才会去加载对应的插件到内存中。
3、一个任务就是一个JVM的进程,一个任务的执行就是一个模版设计模式,init,perpare,split,schedule,post 最终java的多态会走到 自定义的reader和writer的插件中。
4、schedule是任务的分割与执行,每一个TaskGroupContainer 都会运行在一个线程中,一个TaskGroupConatiner中有多个Task处理。因此Task内部为了加速task的快速执行因此也需要使用多线程并发的方式进行执行,TaskExecutor 抽象为一个任务的执行封装体。这个类主要为一个任务的执行,目前看一个任务的执行,会再次创建2个线程一个Reader线程,一个Writer线程,二个线程之间通过ArrayBlockingQueue进行数据的通信,也就是生产者和消费者的设计方式,必须用到ReetrantLock Condiition 进行控制并分。设计的也是很合理。如果有10个Task,5个线程,5个运行中,其它的5个只能等待,cpu自旋等待
5、任务基本的流程就是:
读取插件:将源数据库中的东西转换为Record放到MemoryChannel中,也就是需要将开源的数据字段类型转换为 datax的内部数据类型
写入插件:将Channle中的数据获取到,然后写入到开源的数据库中,需要将record字段类型转换为开源类型。
这也就是需要定义内部的Datax数据类型,然后支持各种数据类型进行转换
java基础用到了哪些东西:commons-cli包的命令行的解析,配置文件到类的映射,反射,类加载器隔离,多线程,线程池,生产者与消费者,多线程并发控制,线程之间的协调,AQS的原理基本理解,多态
目前看只有单机版本的执行,怎么设置周期任务,数据源之间的依赖,然后在数据同步。
最后还需要做一个web系统 配置各种数据源,然后设置周期调度的时间,进行定时的数据全量或者增量的数据同步,分钟,小时的数据同步。
个人觉得 分布式调度系统获取所有的同步任务,分发到不同的机器中,然后多个机器分别执行task任务,这样就分布式进行执行了
国内github:
datax编译打包:
DataX源码打包编译采坑记_点点的博客-CSDN博客_datax 编译
datax的docker打包:
通过Dockerfile来部署datax容器 - 百里登峰 - 博客园