以下文章来源于大数据与云原生技术分享 ,作者liugp
推荐语:随着互联网流量爆发式增长,越来越多的公司业务需要支撑海量数据存储,对高并发、高可用、高可扩展性等特性提出了更高的要求。这也促使各种类型的数据库快速发展,至今常见数据库已经达到 200 多个。与之相伴的便是,各种数据库之间的同步与转换需求激增,数据集成便成了大数据领域的一个亟需解决的方向。当前市面上没有一个简单易用且支持每天数百亿条海量数据同步的开源软件,于是 SeaTunnel 应运而生。
SeaTunnel 是一个非常好用、超高性能的分布式数据集成平台,架构于 Apache Spark 和 Apache Flink 之上,实现了海量数据的实时同步与转换。每天可以稳定高效地同步数百亿数据,目前已接近百家公司在生产上使用。
——MobTech袤博科技政府产研部Java开发专家 竹石
一、什么是数据集成?
数据集成是指将来自不同数据源的数据整合到一起形成一个统一的数据集。这个过程包括从不同的数据源中收集数据,对数据进行清洗、转换、重构和整合,以便能够在一个统一的数据仓库或数据湖中进行存储和管理。
- 数据集成可以帮助企业更好地理解和利用他们的数据,并促进数据驱动的决策和业务流程优化。在数据集成过程中,需要考虑数据质量、数据安全性、数据格式、数据结构等方面的问题,并采用适当的技术和工具来解决这些问题,例如 ETL(抽取、转换、加载)工具、数据映射工具、数据清洗工具、数据建模工具等。
- 一般数据集成用到的工具主要有:
Sqoop
、DataX
、或是本章讲解的SeaTunnel
,这三个工具都是数据转换集成工具,使用其中一个即可,其实也可以这样认为Sqoop
是第一代,DataX
是第二代,SeaTunnel
是第三代工具,Sqoop
用的不是很多了,Datax
应该用的还是比较多的,SeaTunnel
是Apache
顶级项目,也是最新代的数据集成工具,有兴趣的小伙跟随我的文章一起了解SeaTunnel
工具。想了解Sqoop
和DataX
小伙伴可以查阅我以下文章: - [大数据Hadoop之——数据同步工具Sqoop]
- [大数据Hadoop之——数据同步工具DataX]
二、ETL 又是什么?
前面的文章其实讲过 ETL
,这里只是再次回顾以下,ETL
中的 E
是extract
,数据抽取;T
是 Transform
,代表数据的转换;L 代表Load
,数据加载。
三、SeaTunnel 介绍
1)概述
Apache SeaTunnel
是一个分布式、高性能、易扩展、用于海量数据(离线&实时)同步和转化的数据集成平台,每天可稳定高效地同步数百亿数据,并具有 已用于生产近100家公司。
- SeaTunnel 官网:https://seatunnel.apache.org/
- SeaTunnel GitHub:https://github.com/apache/incubator-seatunnel
SeaTunnel 工作流程图:
2)SeaTunnel 的作用
SeaTunnel专注于数据集成和数据同步,主要针对解决数据集成领域的常见问题:
- 各种数据源:有数百个常用数据源,其版本不兼容。随着新技术的出现,更多的数据源正在出现。用户很难找到能够完全快速支持这些数据源的工具。
- 复杂同步场景:数据同步需要支持离线-全量同步、离线-增量同步、CDC、实时同步、数据库全量同步等多种同步场景。
- 资源需求高:现有的数据集成和数据同步工具往往需要大量的计算资源或JDBC连接资源来完成海量小表的实时同步。这在一定程度上加重了企业的负担。
- 缺乏质量和监控:数据集成和同步过程经常会遇到数据丢失或重复的情况。同步过程缺乏监控,无法直观地了解任务过程中数据的真实情况。
- 复杂的技术栈:企业使用的技术组件不同,用户需要针对不同的组件开发相应的同步程序来完成数据集成。
- 管理和维护难度大:受限于不同的底层技术组件(Flink/Spark),离线同步和实时同步往往分开开发和管理,增加了管理和维护的难度。
3)SeaTunnel 的特点
-
丰富且可扩展的连接器:SeaTunnel 提供了一个不依赖于特定执行引擎的连接器 API。基于此 API 开发的连接器(源、转换、接收器)可以在许多不同的引擎上运行,例如当前支持的 SeaTunnel 引擎、
Flink
、Spark
。 -
连接器插件:插件设计允许用户轻松开发自己的连接器并将其集成到 SeaTunnel 项目中。目前,SeaTunnel已经支持
100
多个连接器,而且数量还在激增。有列表 当前支持的连接器 -
批量流集成:基于 SeaTunnel 连接器API开发的连接器,完美兼容离线同步、实时同步、全同步、增量同步等场景。它大大降低了管理数据集成任务的难度。
支持分布式快照算法,保证数据一致性。 -
多引擎支持:SeaTunnel 默认使用
SeaTunnel
引擎进行数据同步。同时,SeaTunnel 还支持使用 Flink 或 Spark 作为连接器的执行引擎,以适应企业现有的技术组件。SeaTunnel 支持多个版本的 Spark 和 Flink。 - JDBC多路复用,数据库日志多表解析:SeaTunnel支持多表或全数据库同步,解决了JDBC连接过多的问题;支持多表或全库日志读写解析,解决了CDC多表同步场景重复读取解析日志的问题。
- 高吞吐、低时延:SeaTunnel 支持并行读写,提供稳定可靠的数据同步能力,高吞吐、低时延。
- 完善的实时监控:SeaTunnel支持数据同步过程中每个步骤的详细监控信息,让用户轻松了解同步任务读写的数据数量、数据大小、QPS等信息。
4)Seatunnel 优势与缺点
优势
- 简单易用,灵活配置,无需开发
- 模块化和插件化
- 支持利用SQL做数据处理和聚合
- 由于其高度封装的计算引擎架构,可以很好的与中台进行融合,对外提供分布式计算能力
缺点
- Spark支持2.2.0 – 2.4.8,不支持spark3.x
- Flink支持1.9.0,目前flink已经迭代至1.14.x,无法向上兼容
- Spark作业虽然可以很快配置,但相关人员还需要懂一些参数的调优才能让作业效率更优
5)核心理念
SeaTunnel 设计的核心是利用设计模式中的“控制翻转”或者叫“依赖注入”,主要概括为以下两点:
- 上层不依赖底层,两者都依赖抽象;
- 流程代码与业务逻辑应该分离。整个数据处理过程,大致可以分为以下几个流程:输入 -> 转换 -> 输出,对于更复杂的数据处理,实质上也是这几种行为的组合:
四、架构演进
再看 SeaTunnel 架构演进的过程,我们现在目前在做的一个事情就是从 v1 到 v2的架构改造和升级。
对于 V1 版本来讲,SeaTunnel 本质上是一个 ETL平台。而 V2 版本则向 ELT 的路线发展。基于整个架构和设计哲学的讨论,我们可以在https://github.com/apache/incubator-seatunnel/issues/1608 看到,如果有兴趣,可以去了解一下 SeaTunnel 架构演进的前世今生。
V1 架构
- V1 架构中,SeaTunnel 的连接器和异构数据都是强依赖分布式计算引擎的,对于不同的计算引擎,会有不同的一个 API 层,连接器也都依赖着 Spark 和 Flink,已经开发好的连接器本质上也都是 Spark connector 和 Flink connecter。
- 接入数据之后,再去对接入进来的数据进行转换,然后再进行写出。这套设计哲学虽然代码开发量很少,而且很多细节都不需要考虑,因为现在开源的 Spark、Flink的 connecotor 都已经给我们解决了大多数的问题,但实际上这也是一种弊端。第一,强依赖计算引擎,我们无法做到解耦,而且每当计算引擎做大版本升级的时候,就需要进行大量的底层改造,难度比较大。
V2架构
基于这些痛点,我们对 V 2 版本进行了重构。首先,V2 版本有了自己的一套API,也是有了自己的一套数据类型,就可以去开发自己的连接器,而不依赖任何引擎,接入的每一条数据都是 SeaTunnelRow,通过翻译层,把 SeaTunnelRow push 到对应的计算引擎里。
最后做一下总结,进行 V1 和 V2 架构的升级对比,到底我们做了哪些事情。
五、相关竞品及对比
SeaTunnel Engine性能测试
对比的工具有大家耳熟能详的 DataX,袋鼠云的Chunjun,可能对于Chunjun大家比较陌生,实际上它没改名之前叫 FlinkX,以及最近刚进入 Apache 孵化器的 StreamPark(原名 StreamX)。
六、SeaTunnel 部署和简单使用
1)安装 JDK
下载地址(也可去官网下载):
链接:https://pan.baidu.com/s/1gOFkezOH-OfDcLbUmq6Dhw?pwd=szys
提取码:szys
# jdk包在我下面提供的资源包里,当然你也可以去官网下载。tar -xf jdk-8u212-linux-x64.tar.gz# /etc/profile文件中追加如下内容:echo "export JAVA_HOME=`pwd`/jdk1.8.0_212" >> /etc/profileecho "export PATH=$JAVA_HOME/bin:$PATH" >> /etc/profileecho "export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar" >> /etc/profile# 加载生效source /etc/profile
2)下载
export version="2.3.1"wget "https://archive.apache.org/dist/incubator/seatunnel/${version}/apache-seatunnel-incubating-${version}-bin.tar.gz"tar -xzvf "apache-seatunnel-incubating-${version}-bin.tar.gz"
3)安装接器插件
从 2.2.0-beta 开始,二进制包默认不提供连接器依赖,所以第一次使用时,我们需要执行以下命令来安装连接器:(当然也可以手动下载连接器 [Apache Maven Repository](https://repo.maven.apache.org/maven2/org/apache/seatunnel/
下载,然后手动移动到连接器目录下的 Seatunnel 子目录)。
# config/plugin_config ,可以修改这个配置指定下载连接器,会下载到这个目录下connectors/seatunnel/cd apache-seatunnel-incubating-${version}sh bin/install-plugin.sh 2.3.1
4)快速开始
config/v2.batch.conf.template
env { execution.parallelism = 1 job.mode = "BATCH"}source { FakeSource { result_table_name = "fake" row.num = 16 schema = { fields { name = "string" age = "int" } } }}sink { Console {}}
启动应用程序:
cd "apache-seatunnel-incubating-${version}"# 连接器:connectors/seatunnel/connector-fake-2.3.1.jar./bin/seatunnel.sh --config ./config/v2.streaming.conf.template -e local
5)快速开始使用 Flink
编辑 config/v2.streaming.conf.template
,决定了海隧道启动后数据输入、处理和输出的方式和逻辑。下面是配置文件的示例,与上面提到的示例应用程序相同。
env { execution.parallelism = 1 job.mode = "BATCH"}source { FakeSource { result_table_name = "fake" row.num = 16 schema = { fields { name = "string" age = "int" } } }}sink { Console {}}
启动应用程序(Flink 版本之间 1.15.x 和 1.16.x):
cd "apache-seatunnel-incubating-${version}"./bin/start-seatunnel-flink-15-connector-v2.sh --config ./config/v2.streaming.conf.template
这里只是演示了官方文档里的简单示例,有兴趣的话,可以去实验其它的数据转换场景。其实转换的思路跟之前的软件都是一样的,有任何疑问欢迎给我留言,后续会更新相关技术类的文章,请小伙伴耐心等待,可关注我的公众号【大数据与云原生技术分享】加群交流或私信交流~
服务器托管,北京服务器托管,服务器租用 http://www.fwqtg.net