dataX运行原理学习

设计理念
异构数据源离线同步是将源端数据同步到目的端,但是端与端的数据源类型种类繁多,在没有 DataX 之前,端与端的链路将组成一个复杂的网状结构,非常零散无法将同步核心逻辑抽象出来,DataX 的理念就是作为一个同步核心载体连接连接各类数据源,当我们需要数据同步时,只需要以插件的形式接入到 DataX 即可,将复杂的网状结构链路变成了一个星型结构,如下图所示:
在这里插入图片描述
框架设计
DataX 本身作为离线数据同步框架,采用 Framework + plugin架构构建。将数据源读取和写入抽象成为 Reader/Writer 插件,纳入到整个同步框架中。
在这里插入图片描述
其中:
Reader:数据采集模块,负责采集数据源的数据,将数据发送给Framework。
Writer:数据写入模块,负责不断向Framework取数据,并将数据写入到目的端。
Framework:用于连接reader和writer,作为两者的数据传输通道,并处理缓冲,流控,并发,数据转换等核心技术问题。

核心概念
在这里插入图片描述
Job:单个数据同步的作业,称为一个Job,一个Job启动一个进程。
Task:根据不同数据源的切分策略,一个Job会切分为多个Task,Task是DataX作业的最小单元,每个Task负责一部分数据的同步工作。
TaskGroup:Scheduler调度模块会对Task进行分组,每个Task组称为一个Task Group。每个Task Group负责以一定的并发度运行其所分得的Task,单个Task Group的并发度为5。
Reader–>Channel–>Writer:每个Task启动后,都会固定启动Reader–>Channel–>Writer的线程来完成同步工作。
Job、Task Group、Task 三者之间的关系:
在这里插入图片描述
Channel:DataX会单独启动一条线程运行运行一个Task,而Task会持有一个Channel,用作Reader与Writer的数据传输媒介,DataX的数据流向如下:
在这里插入图片描述
Channel作为传输通道,即能充当缓冲层,同时还能对数据传输进行限流操作。
Transformer:DataX的transformer模式同时还提供了强大的数据转换功能,DataX默认提供了丰富的数据转换实现类,用户还可以根据项目自身需求,扩展数据转换。
在这里插入图片描述

调度流程
DataX 将用户的 job.json 同步作业配置解析成一个 Job,DataX 通过 JobContainer 完成全局切分、调度、前置语句和后置语句等工作,整体调度流程如下:
在这里插入图片描述
调度决策思路
1、切分策略
1)计算并发量(即 needChannelNumber 大小)
DataX有流控模式,其中,可以设置 bps 限速,tps 限速:
• bps 限速:needChannelNumber = 总 byteLimit / 单个 Channel byteLimit
• tps 限速:needChannelNumber = 总 recordLimit / 单个 Channel recordLimit
如果以上都没有设置,则会根据用户在 job.setting.speed.channel 配置的并发数量设置 needChannelNumber。
2)根据 needChannelNumber 将 Job 切分成多个 Task
这个步骤的具体切分逻辑交由相关插件去完成,例如 Rdb 对数据的拆分主要分成两类:
• 如果用户配置了具体的 Table 数量,那么就按照 Table 为最小单元进行拆分(即一个 Table 对应一个 Task),并生成对应的 querySql;
• 如果用户还配置了 splitPk,则会根据 splitPk 进行切分,具体逻辑是根据 splitPk 区间对 Table 进行拆分,并生成对应的 querySql。
2、公平分配策略
DataX 在执行调度之前,会调用 JobAssignUtil#assignFairly方法对切分好的 Task 公平分配给每个 TaskGroup。
在分配之前,会计算 TaskGroup 的数量,具体公式:
int taskGroupNumber = (int) Math.ceil(1.0 * channelNumber / channelsPerTaskGroup);
channelNumber 即为在切分策略中根据用户配置计算得到的 needChannelNumber 并发数量大小,channelsPerTaskGroup 为每个 TaskGroup 需要的并发数量,默认为 5。
求出 TaskGroup 的数量之后,就会执行公平分配策略,将 Task 平均分配个每个 TaskGroup,最后执行调度,完成整个同步作业。举个公平分配策略的例子:
假设 A 库有表 0、1、2,B 库上有表 3、4,C 库上有表 5、6、7,如果此时有 4 个
TaskGroup,则 assign 后的结果为:
taskGroup-0: 0, 4,
taskGroup-1: 3, 6,
taskGroup-2: 5, 2,
taskGroup-3: 1, 7
举个例子来描述 Job、Task、Task Group 之间的关系:
用户构建了一个数据同步作业,该作业的目的是将 MySql 的 100 张表同步到 Oracle 库中,假设此时用户设置了 20 个并发(即 channelNumber=20):

  1. DataX 根据表的数量切分成 100 个 Task;
  2. DataX 默认给每个 TaskGroup 分配 5 个 Channel,因此 taskGroupNumber = channelNumber / channelsPerTaskGroup = 20 / 5 = 4;
  3. 根据 DataX 的公平分配策略,会将 100 个 Task 平均分配给每个 TaskGroup,因此每个 TaskGroup 处理 taskNumber / taskGroupNumber = 100 / 4 = 25 个 Task。
    以上的例子用如下图表示:
    在这里插入图片描述

由于一个Channel对应一个线程执行,因此DataX的线程模型可以用如下图表示:
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值