外围概念
整个SeaTunnel设计的外围是利用设计模式中的管制翻转
或者叫依赖注入
,次要概括为以下两点:
- 下层不依赖底层,两者都依赖形象
- 流程代码与业务逻辑应该拆散
对于整个数据处理过程,大抵能够分为以下几个流程:输出 -> 转换 -> 输入,对于更简单的数据处理,本质上也是这几种行为的组合:
内核原理
SeaTunnel将数据处理的各种行为形象成Plugin
,并应用SPI
技术进行动静注册,设计思路保障了框架的灵便扩大,在以上实践根底上,数据的转换与解决还须要做对立的形象,譬如比拟有名异构数据源同步工具DataX
,也同样对数据单条记录做了对立形象。
在SeaTunnel V1架构体系中,因为背靠Spark和Flink两大分布式计算框架,框架曾经为咱们做好了数据源形象的工作,Flink的DataStream、Spark的DataFrame曾经是对接入数据源的高度形象,在此基础上咱们只须要在插件中解决这些数据抽象即可,同时借助于Flink和Spark提供的SQL接口,还能够将每一次解决完的数据注册成表,不便用SQL进行解决,缩小代码的开发量。
实际上SeaTunnel最初的目标是主动生成一个Spark或者一个Flink作业,并提交到集群中运行。
SeaTunnel连接器V1 API解析
架构概览
目前在我的项目dev
分支下,SeaTunnel连接器V1 API所在的模块如图所示:
- seatunnel-api-base:根底API层形象
- seatunnel-api-flink:Flink引擎API层形象
- seatunnel-api-spark:Spark引擎API层形象
seatunnel-api-base
在根底模块中,有以下代码:
为了更清晰的了解这些类之间的关系,笔者这里制作了一张简略的UML类图:
整个API的组成能够大体分为三局部:
- 插件层:提供Source、Transform、Sink插件定义
- 执行层:提供执行器和运行上下文定义
- 构建层:提供命令行接口定义
构建层接管命令参数构建执行器,执行器初始化上下文,上下文注册插件并启动插件,至此,整个作业开始运行。
seatunnel-api-spark
在Spark引擎API层有以下代码:
同样,笔者也整顿了一张UML类图来示意它们之间的关系:
整个流程与Base模块统一,在这里笔者不过多赘述,有趣味的读者能够自行观看源码。
seatunnel-api-flink
在Flink引擎API层有以下代码:
同样,笔者也整顿了一张UML类图来示意它们之间的关系:
整个流程与Base模块统一,在这里笔者不过多赘述,有趣味的读者能够自行观看源码。
SeaTunnel连接器V1运行原理
启动器模块概览
整个我的项目的最外层的启动类都放在以下模块中:
跟连接器V1无关的模块如下:
- seatunnel-core-base:V1根底启动模块
- seatunnel-core-flink:V1flink引擎启动模块
- seatunnel-core-flink-sql:V1flink-sql引擎启动模块
- seatunnel-core-spark:V1spark引擎启动模块
执行流程
为了更好的了解SeaTunnel V1的启动流程,笔者在这里制作了一张简略的时序图:
程序最外层的启动由start-seatunnel-${engine}.sh
开始,用户依据将配置文件从脚本传入,脚本调用org.apache.seatunnel.core.spark.SparkStarter
或者org.apache.seatunnel.core.flink.FlinkStarter
,实际上这个类只做一个工作:将所有参数拼接成spark-submit
或者flink
命令,而后脚本接管到spark-submit
或者flink
命令并提交到集群中;提交到集群中真正执行job的类实际上是org.apache.seatunnel.spark.SeatunnelSpark
或是org.apache.seatunnel.flink.SeatunnelFlink
,读者如果想间接深刻理解作业启动外围流程的话举荐浏览这两个类的源码。
执行原理
Spark
- SparkSource插件将异构数据源接入为DataFrame
- SparkTransform插件将SparkSource接入的DataFrame进行转换解决
- SparkSink插件将SparkTransform解决好的DataFrame写入到指标数据源
Flink
- FlinkSource插件将异构数据源接入为DataStream
- FlinkTransform插件将FlinkSource接入的DataStream进行转换解决
- SparkSink插件将FlinkTransform解决好的DataStream写入指标数据源
SeaTunnel连接器V2 API解析
架构概览
目前在我的项目dev分支下,SeaTunnel连接器V2 API所在的模块如图所示:
- seatunnel-api:连接器V2所有的API定义
数据抽象
SeaTunnel连接器V2 API在数据层面做了形象,定义了本人的数据类型,这是与连接器V1最大的不同点,连接器V1应用的是引擎数据抽象的能力,然而连接器V2本人提供的这个异构数据源对立的能力:
在所有的Source连接器和Sink连接器中,解决的都是SeaTunnelRow
类型数据,同时SeaTunnel也对内设置了数据类型标准,所有通过Source接入进来的数据会被对应的连接器转化为SeaTunnelRow
送到上游。
API Common
在API common包下有以下接口的定义:
在这里因为篇幅关系只介绍比拟外围的几个接口:
- PluginIdentifierInterface:插件惟一标识
- SeaTunnelContext:SeaTunnel利用上下文,每个SeaTunnel Job蕴含的上下文对象,保留了以后源表的元数据
- SeaTunnelPluginLifeCycle:插件申明周期
具体接口中有哪些办法读者能够自行浏览对应类的源码,在这里笔者将不过多赘述。
API Source
在API source包下有以下接口的定义:
在这里因为篇幅关系只介绍比拟外围的几个接口:
- Boundedness:标识数据有界无界,连接器V2设计理念基于批流一体,此接口用于区分流式作业还是批式作业
- Collector:数据收集器,用于收集Source连接器产生的数据并推往上游
- SeaTunnelSource:Source插件基类,所有的Source连接器主类均继承于这个接口
- SourceReader:Source插件真正解决数据接入的接口
- SourceSplit:数据分片接口,连接器V2反对数据并行读入,晋升数据接入效率
- SourceSplitEnumerator:数据分片器,此接口用于散发数据分片至对应的SourceReader中
API Sink
在API sink包下有以下接口的定义:
在这里因为篇幅关系只介绍比拟外围的几个接口:
- SeaTunnelSink:Sink插件基类,所有的Sink连接器均继承于这个接口
- SinkWriter:Sink插件真正实现数据输入的接口
- SinkCommitter:用于解决
SinkWriter#prepareCommit
返回的数据信息,蕴含须要提交的事务信息,连接器V2在Sink设计上提供二阶段提交的接口,从而使连接器有了实现Exactly-Once的可能性 - SinkAggregatedCommitter:用于解决
SinkWriter#prepareCommit
返回的数据信息,蕴含须要提交的事务信息等,用于在单节点多任务一起提交事务信息,这样能够防止提交阶段二局部失败导致状态不统一的问题(注:在实现连接器时优先实现这个接口,这样会兼容性更强)
小结
连接器V2在架构分层上与计算引擎进行解耦,定义了本人的元数据定义以及数据类型定义,在API层和计算引擎层减少了翻译层,将SeaTunnel自定义的数据源通过翻译层接入到引擎中,从而真正实现接口和引擎拆散的目标。
SeaTunnel连接器V2运行原理
启动器模块概览
整个我的项目的最外层的启动类都放在以下模块中:
跟连接器V2无关的模块如下:
- seatunnel-core-starter:V2根底启动模块
- seatunnel-flink-starter:V2flink引擎启动模块
- seatunnel-spark-starter:V2spark引擎启动模块
执行流程
为了更好的了解SeaTunnel V2的启动流程,笔者在这里制作了一张简略的时序图:
程序最外层的启动由start-seatunnel-${engine}-new-connector.sh
开始,用户依据将配置文件从脚本传入,脚本调用org.apache.seatunnel.core.spark.SparkStarter
或者org.apache.seatunnel.core.flink.FlinkStarter
,实际上这个类只做一个工作:将所有参数拼接成spark-submit
或者flink
命令,而后脚本接管到spark-submit
或者flink
命令并提交到集群中;提交到集群中真正执行job的类实际上是org.apache.seatunnel.spark.SeatunnelSpark
或是org.apache.seatunnel.flink.SeatunnelFlink
,读者如果想间接深刻理解作业启动外围流程的话举荐浏览这两个类的源码,连接器V2和连接器V1的启动流程基本一致。
SeaTunnel V2 on Spark
SeaTunnel Source连接器V2将异构数据源接入,生成以SeaTunnelRow
为根本单位的数据源,在翻译层实现了Spark DataSource API V2
,翻译层使得Spark能够接入以SeaTunnelRow
为根本单位的数据源,从而实现无缝接入Spark的目标。
对于Spark DataSource API V2
的详细信息,读者能够参考:https://www.databricks.com/se...,因为这篇文章的主题并不是介绍Spark的个性,所以笔者在这里不过多赘述。
SeaTunnel V2 on Flink
SeaTunnel Source连接器V2将异构数据源接入,生成以SeaTunnelRow
为根本单位的数据源,同时在翻译层实现了Flink source function
和Flink sink function
,翻译层使得Flink能够接入以SeaTunnelRow
为根本单位的数据源,从而实现无缝接入Flink的目标。
对于Flink source Function
和Flink sink function
的详细信息,读者能够参考:https://nightlies.apache.org/...,因为这篇文章的主题并不是介绍Flink的个性,所以笔者在这里不过多赘述。
执行原理
Source连接器接入数据源为SeaTunnelRow,Translation层转换SeaTunnelRow数据源为各种计算引擎外部的数据源,Sink 连接器接管计算引擎外部转换好的SeaTunnelRow数据源并写入到指标数据源中。
V1 API vs V2 API
特色 | 连接器V1 | 连接器V2 |
---|---|---|
引擎依赖 | 强依赖Spark、Flink | 无依赖 |
连接器实现 | 针对不同引擎要实现屡次 | 只实现一遍 |
引擎版本升级难易水平 | 较难,连接器与引擎高度耦合 | 较易,针对不同版本开发不同翻译层即可 |
连接器参数是否对立 | 针对不同引擎可能会有不同参数 | 参数对立 |
自定义分片逻辑 | 依赖Spark、Flink曾经实现好的数据Connector,分片逻辑不可控 | 分片逻辑可自定义 |
将来瞻望
目前社区正在做的事件:
- 连接器接入,社区打算在年底接入80+种数据源
- Web服务化,社区目前在做Web服务化相干工作,用户可依据Web界面进行作业的治理、日志查看、高低线操作
- 计算引擎开发,社区目前在开发本人的计算引擎,更专一于数据同步,晋升性能
将来指标:
- 性能优化,多维度指标监控,准确流速管制,可视化大屏监控
- 可视化利落拽疾速生成数据集成工作
- 更多调度平台无缝接入
最终目标:胜利从Apache孵化器毕业,成为世界一流的诞生于中国的数据集成平台工具
贡献者招募
目前社区正在蓬勃向前倒退,大量feature
须要去开发实现,毕业之路道阻且艰,期待更多的有志之士参加到社区共建,欢送酷爱开源的小伙伴退出SeaTunnel社区,有意者可发邮件至[email protected]
或微信tyrantlucifer
分割我征询相干事宜,让咱们一起用开源点燃璀璨的程序人生。