大家好,我是脚丫先生 (o^^o)
最近比较忙。
1、实时流模块的开发。
2、给小伙伴们准备最全面试题,已有 6 万字。
不过在怎么忙,都要保证持续的输出。
源源不断的知识输出,就会有源源不断的快乐输入。
今天想和小伙伴们分享,自己在项目里用的比较频繁的采集工具Datax。
在日常大数据生产环境中,经常会有关系型数据库和关系型数据库,以及关系型和非关系型数据库数据之间的互相转换的需求,在需求选择的初期解决问题的方法----离线数据同步工具/平台。
好了,我们开始今天的正文。
一、Datax 概述
1.1 Datax 介绍
DataX 是阿里巴巴开源的一个异构数据源离线同步工具,致力于实现包括关系型数据库(MySQL、Oracle 等)、HDFS、Hive、ODPS、HBase、FTP 等各种异构数据源之间稳定高效的数据同步功能。
1.2 DataX 的设计
为了解决异构数据源同步问题,DataX 将复杂的网状的同步链路变成了星型数据链路,DataX 作为中间传输载体负责连接各种数据源。当需要接入一个新的数据源的时候,只需要将此数据源对接到 DataX,便能跟已有的数据源做到无缝数据同步。
1.3 框架设计
DataX 本身作为离线数据同步框架,采用 Framework + plugin 架构构建。将数据源读取和写入抽象成为 Reader/Writer 插件,纳入到整个同步框架中。
DataX 在设计之初就将同步理念抽象成框架+插件的形式.框架负责内部的序列化传输,缓冲,并发,转换等而核心技术问题,数据的采集(Reader)和落地(Writer)完全交给插件执行。
- Read 数据采集模块,负责采集数据源的数据,将数据发送至 FrameWork。
- Writer 数据写入模块,负责不断的向 FrameWork 取数据,并将数据写入目的端。
- FrameWork 用于连接 reader 和 write,作为两者的数据传输通道,处理缓冲,流控,并发,转换等核心技术问题。
1.4 DataX 插件体系
DataX 目前已经有了比较全面的插件体系,主流的 RDBMS 数据库、NOSQL、大数据计算系统都已经接入,目前支持数据如下图,详情请点击:DataX 数据源参考指南
1.5 运行原理
- Job 完成单个数据同步的作业称之为 job。DataX 接受到一个 Job 之后,将启动一个进程来完成整个作业同步过程。负责数据清理,子任务划分,TaskGroup 监控管理。
- Task 由 Job 切分而来,是 DataX 作业的最小单元,每个 Task 负责一部分数据的同步工作。
- Schedule 将 Task 组成 TaskGroup,默认单个任务组的并发数量为 5。
- TaskGroup 负责启动 Task。
详细解说:DataX 完成单个数据同步的作业,我们称之为 Job,DataX 接受到一个 Job 之后,将启动一个进程来完成整个作业同步过程。
DataX Job 模块是单个作业的中枢管理节点,承担了数据清理、子任务切分(将单一作业计算转化为多个子 Task)、TaskGroup 管理等功能。DataXJob 启动后,会根据不同的源端切分策略,将 Job 切分成多个小的 Task(子任务),以便于并发执行。
Task 便是 DataX 作业的最小单元,每一个 Task 都会负责一部分数据的同步工作。切分多个 Task 之后,DataX Job 会调用 Scheduler 模块,根据配置的并发数据量,将拆分成的 Task 重新组合,组装成 TaskGroup(任务组)。
每一个 TaskGroup 负责以一定的并发运行完毕分配好的所有 Task,默认单个任务组的并发数量为 5。每一个 Task 都由 TaskGroup 负责启动,Task 启动后,会固定启动 Reader—>Channel—>Writer 的线程来完成任务.
DataX 调度流程 举例来说,用户提交了一个 DataX 作业,并且配置了 20 个并发,目的是将一个 100 张分表的 mysql 数据同步到 odps 里面。 DataX 的调度决策思路是:
- 1 DataXJob 根据分库分表切分成了 100 个 Task。
- 2 根据 20 个并发,默认单个任务组的并发数量为 5,DataX 计算共需要分配 4 个 TaskGroup。
- 3 这里 4 个 TaskGroup 平分切分好的 100 个 Task,每一个 TaskGroup 负责以 5 个并发共计运行 25 个 Task。
二、快速入门
2.1 官方地址
下载地址:datax-opensource.oss-cn-hangzhou.aliyuncs.com/datax.tar.g…
2.2 前置要求
- Linux
- JDK(1.8 以上,推荐 1.8)
- Python(推荐 Python2.6.X)
2.3 安装
(1) 将下载好的 datax.tar.gz 上传到服务器的/home/soft 文件夹下
[root@xxx soft]$ ls
datax.tar.gz
(2) 解压 datax.tar.gz 到/opt/module
[root@xxx soft]$ tar -zxvf datax.tar.gz -C /opt/module/
(3) 运行脚本检测
[root@xxx bin]$ cd /opt/module/datax/bin/
[root@xxxbin]$ python datax.py /opt/module/datax/job/job.json
(4) json 配置文件注释
/*一个json就是一个job,一个job主要包含:
content,setting 两个属性*/
{
"job": {
/*content是job的核心,主要放reader和writer插件*/
"content": {
/*raader插件*/
"reader": {},
/*writer插件*/
"writer": {}
},
/*setting主要用来设置job的基本设置*/
"setting": {
/*speed流量控制*/
"speed": {
"channel": 1, /*同步时候的并发数*/
"byte": 1024 /*同步时候的字节大小,影响速度,可选*/
},
/*脏数据控制,配置的意思是当脏数据大于10条,或者脏数据比例达到0.05%,任务就会报错*/
"errorLimit": {
"record": 10,/*脏数据最大记录数阈值*/
"percentage": 0.05 /*脏数据占比阈值*/
}
}
}
}
json 的 reader 和 writer 内容根据插件不同而变化,具体查询官网
三、 DataX 类图
整个流程大致如下
启动步骤解析:
1、解析配置,包括 job.json、core.json、plugin.json 三个配置
2、设置 jobId 到 configuration 当中
3、启动 Engine,通过 Engine.start()进入启动程序
4、设置 RUNTIME_MODEconfiguration 当中
5、通过 JobContainer 的 start()方法启动 6、依次执行 job 的 preHandler()、init()、prepare()、split()、schedule()、- post()、postHandle()等方法。
7、init()方法涉及到根据 configuration 来初始化 reader 和 writer 插件,这里涉及到 jar 包热加载以及调用插件 init()操作方法,同时设置 reader 和 writer 的 configuration 信息
8、prepare()方法涉及到初始化 reader 和 writer 插件的初始化,通过调用插件的 prepare()方法实现,每个插件都有自己的 jarLoader,通过集成 URLClassloader 实现而来
9、split()方法通过 adjustChannelNumber()方法调整 channel 个数,同时执行 reader 和 writer 最细粒度的切分,需要注意的是,writer 的切分结果要参照 reader 的切分结果,达到切分后数目相等,才能满足 1:1 的通道模型
10、channel 的计数主要是根据 byte 和 record 的限速来实现的,在 split()的函数中第一步就是计算 channel 的大小
11、split()方法 reader 插件会根据 channel 的值进行拆分,但是有些 reader 插件可能不会参考 channel 的值,writer 插件会完全根据 reader 的插件 1:1 进行返回
12、split()方法内部的 mergeReaderAndWriterTaskConfigs()负责合并 reader、writer、以及 transformer 三者关系,生成 task 的配置,并且重写 job.content 的配置
13、schedule()方法根据 split()拆分生成的 task 配置分配生成 taskGroup 对象,根据 task 的数量和单个 taskGroup 支持的 task 数量进行配置,两者相除就可以得出 taskGroup 的数量
14、schdule()内部通过 AbstractScheduler 的 schedule()执行,继续执行 startAllTaskGroup()方法创建所有的 TaskGroupContainer 组织相关的 task,TaskGroupContainerRunner 负责运行 TaskGroupContainer 执行分配的 task。scheduler的具体实现类为ProcessInnerScheduler。
15、taskGroupContainerExecutorService 启动固定的线程池用以执行TaskGroupContainerRunner 对象,TaskGroupContainerRunner 的 run()方法调用 taskGroupContainer.start()方法,针对每个 channel 创建一个 TaskExecutor,通过 taskExecutor.doStart()启动任务。
四、 Datax-web
datax是基于脚本化的采集工具,因此小伙伴会问:有可视化界面进行采集任务执行吗?
这必须有。
4.1 Datax-web的介绍
DataX Web是在DataX之上开发的分布式数据同步工具,提供简单易用的 操作界面,降低用户使用DataX的学习成本,缩短任务配置时间。
用户可通过页面选择数据源即可创建数据同步任务。
支持RDBMS、Hive、HBase、ClickHouse、MongoDB等数据源,RDBMS数据源可批量创建数据同步任务,支持实时查看数据同步进度及日志并提供终止同步功能,集成并二次开发xxl-job可根据时间、自增主键增量同步数据。
4.2 Datax-web的搭建
小伙伴们可以根据官网的教程进行搭建,如有疑问的可以直接联系我。
我们在做大数据采集模块过程,是基于datax-web的源码制作成一个docker通用微服务容器,其他模块可以以远程调用的方式使用它,大大节省了开发成本。
好了,今天就聊到这里,之后会继续深入分享。
祝各位终有所成,收获满满!
我是脚丫先生,我们下期见~
更多精彩内容请关注 微信公众号 👇「脚丫先生」🔥:
一枚热衷于分享大数据基础原理,技术实战,架构设计与原型实现之外,还喜欢输出一些个人私活案例。
更多精彩福利干货,期待您的关注 ~