引言
本文主要以 图文 的形式来总结 DataX 和 SeaTunnel 的架构和代码流程,以方便读者去了解里面的源码。
DataX
首先来回顾 DataX:
DataX架构
DataX的核心 架构设计如下:
举个简单的例子去理解上图:用户提交了一个DataX作业,并且配置了20个并发,目的是将一个100张分表的MySQL数据同步到ODPS里面。
DataX的调度决策思路如下:
- Step1:
DataXJob
根据分库分表切分成了100个Task
; - Step2:根据20个并发,
DataX
计算共需要分配4个TaskGroup
; - Step3:4个
TaskGroup
平分切分好的100个Task
,每一个TaskGroup
负责以5个并发共计运行25个Task
。
DataX代码执行流程
《图解DataX任务分配及执行流程》: https://yanglinwei.blog.csdn.net/article/details/122968465
关于代码层面,贴上博主之前画过的一张代码执行流程图:
上图主要有几个核心的类,它们的职责主要如下(点击类即可查看源码):
类 | 职责 |
---|---|
JobContainer | 任务容器 |
Reader | 读插件接口 |
Writer | 写插件接口 |
JobAssignUtil | 任务分配工具类 |
AbstractScheduler | 任务调度抽象类 |
TaskGroupContainer | 任务组容器 |
DataX存在的问题
首先说下DataX的优势,具体有如下:
- 可靠的数据质量监控:如流量、数据量运行时监控以及脏数据检测等;
- 丰富的数据转换功能:让数据在传输过程中可以轻松完成数据脱敏,补全,过滤等数据转换功能;
- 精准的速度控制:可以控制作业速度,让作业在库可以承受的范围内达到最佳的同步速度;
- …
同时开源版本的DataX也存在不足之处,例如:
不支持集群(仅支持单机多线程模式完成同步作业运行),且不支持实时处理,(如:实时数据源Kafka和大数据生态系统中的组件Flink)。
这个时候, Apache SeaTunnel 的出现,似乎弥补了DataX
的短板。
Apache SeaTunnel
SeaTunnel GitHub 地址: https://github.com/apache/seatunnel
Apache SeaTunnel对自己的定义如下:下一代高性能、分布式、海量数据集成框架。
ok,我们继续来看看它的相关功能特性。
SeaTunnel架构
这是Apache SeaTunnel官网贴出的简要的产品设计架构图:
上图似乎不能体现出整个 SeaTunnel 的核心流程要点,仅仅是产品的功能,对于读者来说,可能更看重的是SeaTunnel
是如何做到 分布式、海量数据集成 的设计?
下面继续查看相关核心类图如下(图片来源: https://mp.weixin.qq.com/s/Hvf7TJxMEBVyvnMXVd8E_w):
作者认为他们自研的SeaTunnel Engine
才是整个SeaTunnel的核心,它由三个主要的服务组成(点击类名可以查看对应的源码):
类 | 职责 |
---|---|
CoordinatorService | Master 服务,负责Dag 的生成、Checkpoint 流程控制、资源管理以及作业指标统计与汇总 |
TaskExecutionService | Worker 服务,作业中每个task 真正运行时环境 |
SlotService | 在集群每个节点上都会运行,主要负责节点上资源的划分、申请和回收 |
SeaTunnel代码执行流程
关于SeaTunnel的架构或者和代码执行流程,似乎官网并没有贴出对应的流程设计图。
为了方便读者的理解,博主整理了SeaTunnel 代码执行图,如下:
对于CMD命令层(入口),主要分为了以下几个命令:
-
seatunnel-cluster.sh:主要是用来启动SeaTunnel集群;
-
seatunnel.sh:SeaTunnel客户端,主要用于提交作业至SeaTunnel集群或停止集群中运行的作业等;
-
seatunnel-start-seatunnel-flink-x-connector-v2.sh:主要用于提交作业至Flink集群(注意执行脚本里面使用了
eval
命令,去执行从FlinkStarter控制台打印的flink脚本命令); -
seatunnel-start-seatunnel-spark-x-connector-v2.sh:主要用于提交作业至Spark集群(注意执行脚本里面使用了
eval
命令,去执行从SparkStarter控制台打印的spark脚本命令)。
执行引擎分为了如下几种:
引擎 | 核心类 | 描述 |
---|---|---|
SeaTunnel(Zeta)推荐使用 | SeaTunnelServer | 分为Master和Worker,Master主要用于作业Dag生成、资源管理、指标统计等。Worker主要是执行具体的任务节点,每个Worker是根据SlotProfile的IP 地址是否为本机地址来判断是否执行,具体在(org.apache.seatunnel.engine.server.dag.physical.PhysicalVertex#deploy ) |
Flink | SeaTunnelFlink | PluginExecutorProcessor类型分为Source、Sink、Transform,主要用于转义(Translation)SeaTunnel的配置为Flink可识别的配置,最后使用Flink的TableEnviorment去执行ETL任务 |
Spark | SeaTunnelSpark | 跟Flink引擎的执行逻辑类似,PluginExecutorProcessor类型分为Source、Sink、Transform最后转义并执行ETL任务 |
结论
我们会发现很多项目的设计,都是存在共同之处的,或在其它项目都有类似的设计,比如阅读了SeaTunnel
的代码,会发现有TaskGroup/Slot/ResourceManager
(或许参考了DataX
或Flink
)、Master/Worker
(或许参考了DolphinScheduler
,虽然现在没有拆分)、Connector
(或许参考了Chunjun
或Flink
)等等…
至此,本文大致讲解完了DataX以及SeaTunnel的架构与代码流程了。
本文也是作者阅读源码后的一些整理,仅代表个人的观点,可能存在局限性或不足之处,欢迎大家留言评论,同时也希望能帮助到大家,谢谢大家,本文完!
本文由 白鲸开源 提供发布支持!