说明
SeaTunnel是一个非常易用、超高性能的分布式数据集成平台,支持海量数据的实时同步。每天可稳定高效同步数百亿数据,已被近百家企业应用于生产。
为什么我们需要SeaTunnel
SeaTunnel专注于数据集成和数据同步,主要旨在解决数据集成领域的常见问题:
- 数据源多样:常用数据源有数百种,版本不兼容。随着新技术的出现,更多的数据源不断出现。用户很难找到一个能够全面、快速支持这些数据源的工具。
- 同步场景复杂:数据同步需要支持离线全量同步、离线增量同步、CDC、实时同步、全库同步等多种同步场景。
- 资源需求高:现有的数据集成和数据同步工具往往需要大量的计算资源或JDBC连接资源来完成海量小表的实时同步。这增加了企业的负担。
- 缺乏质量和监控:数据集成和同步过程经常会出现数据丢失或重复的情况。同步过程缺乏监控,无法直观了解任务过程中数据的真实情况。
- 技术栈复杂:企业使用的技术组件不同,用户需要针对不同组件开发相应的同步程序来完成数据集成。
- 管理维护难度:受限于底层技术组件(Flink/Spark)不同,离线同步和实时同步往往需要分开开发和管理,增加了管理维护难度。
SeaTunnel的特点
- 丰富且可扩展的Connector:SeaTunnel提供了不依赖于特定执行引擎的Connector API。基于该API开发的Connector(Source、Transform、Sink)可以运行在很多不同的引擎上,例如目前支持的SeaTunnel Engine、Flink、Spark等。
- Connector插件:插件式设计让用户可以轻松开发自己的Connector并将其集成到SeaTunnel项目中。目前,SeaTunnel 支持超过 100 个连接器,并且数量正在激增。这是当前支持的连接器列表
- 批流集成:基于SeaTunnel Connector API开发的Connector完美兼容离线同步、实时同步、全量同步、增量同步等场景。它们大大降低了管理数据集成任务的难度。
- 支持分布式快照算法,保证数据一致性。
- 多引擎支持:SeaTunnel默认使用SeaTunnel引擎进行数据同步。 SeaTunnel还支持使用Flink或Spark作为Connector的执行引擎,以适应企业现有的技术组件。 SeaTunnel 支持 Spark 和 Flink 的多个版本。
- JDBC复用、数据库日志多表解析:SeaTunnel支持多表或全库同步,解决了过度JDBC连接的问题;支持多表或全库日志读取解析,解决了CDC多表同步场景下需要处理日志重复读取解析的问题。
- 高吞吐量、低延迟:SeaTunnel支持并行读写,提供稳定可靠的高吞吐量、低延迟的数据同步能力。
- 完善的实时监控:SeaTunnel支持数据同步过程中每一步的详细监控信息,让用户轻松了解同步任务读写的数据数量、数据大小、QPS等信息。
- 支持两种作业开发方法:编码和画布设计。 SeaTunnel Web 项目https://github.com/apache/seatunnel-web提供作业、调度、运行和监控功能的可视化管理。
SeaTunnel工作流程图
SeaTunnel的运行流程如上图所示。
用户配置作业信息并选择提交作业的执行引擎。
Source Connector负责并行读取数据并将数据发送到下游Transform或直接发送到Sink,Sink将数据写入目的地。值得注意的是,Source、Transform 和 Sink 可以很容易地自行开发和扩展。
SeaTunnel 是一个 EL(T) 数据集成平台。因此,在SeaTunnel中,Transform只能用于对数据进行一些简单的转换,例如将一列的数据转换为大写或小写,更改列名,或者将一列拆分为多列。
SeaTunnel 使用的默认引擎是SeaTunnel Engine。如果您选择使用Flink或Spark引擎,SeaTunnel会将Connector打包成Flink或Spark程序并提交给Flink或Spark运行。
连接器
- 源连接器SeaTunnel 支持从各种关系型、图形、NoSQL、文档和内存数据库读取数据;分布式文件系统,例如HDFS;以及各种云存储解决方案,例如S3和OSS。我们还支持很多常见SaaS服务的数据读取。您可以在此处访问详细列表。如果您愿意,您可以开发自己的源连接器并将其轻松集成到 SeaTunnel 中。
- 转换连接器如果源和接收器之间的架构不同,您可以使用转换连接器更改从源读取的架构,使其与接收器架构相同。
- Sink Connector SeaTunnel支持将数据写入各种关系型、图型、NoSQL、文档型、内存型数据库;分布式文件系统,例如HDFS;以及各种云存储解决方案,例如S3和OSS。我们还支持将数据写入许多常见的 SaaS 服务。您可以在此处访问详细列表。如果您愿意,您可以开发自己的 Sink 连接器并轻松将其集成到 SeaTunnel 中。
谁使用SeaTunnel
SeaTunnel 拥有大量用户。您可以在用户中找到有关它们的更多信息。
安装 SeaTunnel Zeta 引擎服务器
构建SeaTunnel镜像
要使用 SeaTunnel 运行镜像,首先创建一个Dockerfile:
FROM openjdk:8
ENV SEATUNNEL_VERSION="2.3.4"
ENV SEATUNNEL_HOME="/opt/seatunnel"
#settings.xml和sources.list 需自行准备
COPY files/settings.xml /root/.m2/settings.xml
COPY files/sources.list /etc/apt/sources.list
#RUN wget https://dlcdn.apache.org/seatunnel/${SEATUNNEL_VERSION}/apache-seatunnel-${SEATUNNEL_VERSION}-bin.tar.gz
#RUN tar -xzvf apache-seatunnel-${SEATUNNEL_VERSION}-bin.tar.gz
ADD files/apache-seatunnel-2.3.4-bin.tar.gz /tmp/
RUN apt-key adv --recv-keys --keyserver keyserver.ubuntu.com 871920D1991BC93C \
&& apt-get update
RUN mv /tmp/apache-seatunnel-${SEATUNNEL_VERSION} ${SEATUNNEL_HOME} \
&& mkdir -p $SEATUNNEL_HOME/logs \
&& sed -i 's#repo.maven.apache.org/maven2#maven.aliyun.com/repository/central#g' /opt/seatunnel/mvnw \
&& cd ${SEATUNNEL_HOME} && sh bin/install-plugin.sh ${SEATUNNEL_VERSION}
然后运行以下命令来构建镜像:
docker build -t seatunnel:2.3.4 -f Dockerfile .
运行SeaTunnel
环境配置
创建命名空间
kubectl create namespace seatunnel
准备配置
1. 生成SeaTunnel配置
创建configmap
运行应用程序:: SeaTunnel 已经提供了开箱即用的配置。
在本指南中,我们将使用Seatunnel.streaming.conf:
cat << EOF > seatunnel.streaming.conf
env {
parallelism = 2
job.mode = "STREAMING"
checkpoint.interval = 2000
}
source {
FakeSource {
parallelism = 2
result_table_name = "fake"
row.num = 16
schema = {
fields {
name = "string"
age = "int"
}
}
}
}
sink {
Console {
}
}
EOF
在 Kubernetes 中生成一个名为 Seatunnel-config 的 configmap,以便我们可以在 pod 中挂载配置内容。
kubectl create cm seatunnel-config-n seatunnel \
--from-file=seatunnel.streaming.conf
2. 增加集群配置
我们使用以下命令将 Seatunnel 集群使用的一些配置文件加载到 configmap 中。
本地创建yaml文件如下
创造hazelcast-client.yaml:
cat << EOF > hazelcast-client.yaml
hazelcast-client:
cluster-name: seatunnel
properties:
hazelcast.logging.type: log4j2
network:
cluster-members:
- localhost:5801
EOF
创造hazelcast.yaml:
cat << EOF > hazelcast.yaml
hazelcast:
cluster-name: seatunnel
network:
rest-api:
enabled: true
endpoint-groups:
CLUSTER_WRITE:
enabled: true
DATA:
enabled: true
join:
tcp-ip:
enabled: true
member-list:
- localhost
port:
auto-increment: false
port: 5801
properties:
hazelcast.invocation.max.retry.count: 20
hazelcast.tcp.join.port.try.count: 30
hazelcast.logging.type: log4j2
hazelcast.operation.generic.thread.count: 50
EOF
创造seatunnel.yaml:
cat << EOF > seatunnel.yaml
seatunnel:
engine:
history-job-expire-minutes: 1440
backup-count: 1
queue-type: blockingqueue
print-execution-info-interval: 60
print-job-metrics-info-interval: 60
slot-service:
dynamic-slot: true
checkpoint:
interval: 10000
timeout: 60000
storage:
type: hdfs
max-retained: 3
plugin-config:
namespace: /tmp/seatunnel/checkpoint_snapshot
storage.type: hdfs
fs.defaultFS: file:///tmp/ # Ensure that the directory has written permission
EOF
使用以下命令为配置文件创建 congfigmap
kubectl create configmap hazelcast-client-n seatunnel --from-file=hazelcast-client.yaml
kubectl create configmap hazelcast -n seatunnel --from-file=hazelcast.yaml
kubectl create configmap seatunnelmap -n seatunnel --from-file=seatunnel.yaml
3. 部署Reloader
ConfigMapReloader 可以观察和的变化Secret,并使用关联的DeploymentConfigs、Deployments和Daemonsets Statefulsets来对 Pod 进行滚动升级Rollouts。
部署 Reloader 实现热部署 我们在这里使用 Reloader 在进行配置文件或其他修改时自动重启 pod。您也可以直接给出配置文件的值,不要使用 Reloader
重新加载器
wget https://raw.githubusercontent.com/stakater/Reloader/master/deployments/kubernetes/reloader.yaml
修改namespace并应用
sed -i 's/default/seatunnel/g' reloader.yaml
kubectl apply -f reloader.yaml
部署并运行
部署Seatunnel 集群
创建 seatunnel-cluster.yml:
修改镜像地址为自己上传镜像的地址;
Kubernetes 卷(Volume)需提前准备好;
cat << EOF > seatunnel-cluster.yml
apiVersion: v1
kind: Service
metadata:
name: seatunnel
spec:
selector:
app: seatunnel
ports:
- port: 5801
name: seatunnel
clusterIP: None
---
apiVersion: apps/v1
kind: StatefulSet
metadata:
name: seatunnel
annotations:
configmap.reloader.stakater.com/reload: "hazelcast,hazelcast-client,seatunnelmap"
spec:
serviceName: "seatunnel"
replicas: 3 # modify replicas according to your case
selector:
matchLabels:
app: seatunnel
template:
metadata:
labels:
app: seatunnel
spec:
containers:
- name: seatunnel
image: seatunnel:2.3.4
imagePullPolicy: IfNotPresent
ports:
- containerPort: 5801
name: client
command: ["/bin/sh","-c","/opt/seatunnel/bin/seatunnel-cluster.sh -DJvmOption=-Xms2G -Xmx2G"]
resources:
limits:
cpu: "1"
memory: 4G
requests:
cpu: "1"
memory: 2G
volumeMounts:
- mountPath: "/opt/seatunnel/config/hazelcast.yaml"
name: hazelcast
subPath: hazelcast.yaml
- mountPath: "/opt/seatunnel/config/hazelcast-client.yaml"
name: hazelcast-client
subPath: hazelcast-client.yaml
- mountPath: "/opt/seatunnel/config/seatunnel.yaml"
name: seatunnelmap
subPath: seatunnel.yaml
- mountPath: /data/seatunnel.streaming.conf
name: seatunnel-config
subPath: seatunnel.streaming.conf
volumes:
- name: hazelcast
configMap:
name: hazelcast
- name: hazelcast-client
configMap:
name: hazelcast-client
- name: seatunnelmap
configMap:
name: seatunnelmap
- name: seatunnel-config
configMap:
name: seatunnel-config
items:
- key: seatunnel.streaming.conf
path: seatunnel.streaming.conf
EOF
运行集群
kubectl apply-f seatunnel-cluster.yml -n seatunnel
配置SeaTunnel
配置hazelcast
使用以下命令修改pod中的seatunnel配置
kubectl edit cm hazelcast -n seatunnel
将 member-list 配置更改为您的集群地址
- 这里采用的是headless服务访问方式
- 一般pod之间访问的格式是: [pod-name].[service-name].[namespace].svc.cluster.local
例如:
- seatunnel-0.seatunnel.seatunnel.svc.cluster.local
- seatunnel-1.seatunnel.seatunnel.svc.cluster.local
- seatunnel-2.seatunnel.seatunnel.svc.cluster.local
配置hazelcast-client
kubectl edit cm hazelcast-client -n seatunnel
将 cluster-members 选项更改为您的集群地址例如:
- seatunnel-0.seatunnel.seatunnel.svc.cluster.local:5801
- seatunnel-1.seatunnel.seatunnel.svc.cluster.local:5801
- seatunnel-2.seatunnel.seatunnel.svc.cluster.local:5801
验证
稍后,您将看到 Pod 自动重启并更新 Seatunnel 配置
kubectl edit cm hazelcast-client -n seatunnel
当我们等待所有 pod 更新完成后,我们可以使用以下命令来检查 pod 内部的配置是否已更新
kubectl exec -it seatunnel-0 -n seatunnel -- cat /opt/seatunnel/config/hazelcast-client.yaml
之后我们就可以向任意pod提交任务了
kubectl exec -it seatunnel-0 -n seatunnel -- /opt/seatunnel/bin/seatunnel.sh --config /data/seatunnel.streaming.conf
查看输出日志
您可以跟踪您的作业日志,在成功启动后(在新环境中可能需要一分钟,几秒钟后),您可以:
kubectl exec -it seatunnel-1 -n seatunnel -- tail -f /opt/seatunnel/logs/seatunnel-engine-server.log | grep ConsoleSinkWriter
如下所示(您的内容可能会有所不同,因为我们使用FakeSource自动生成随机流数据):
...
2023-10-10 08:05:07,283 INFO org.apache.seatunnel.connectors.seatunnel.console.sink.ConsoleSinkWriter - subtaskIndex=1 rowIndex=7: SeaTunnelRow#tableId= SeaTunnelRow#kind=INSERT : IibHk, 820962465
2023-10-10 08:05:07,283 INFO org.apache.seatunnel.connectors.seatunnel.console.sink.ConsoleSinkWriter - subtaskIndex=1 rowIndex=8: SeaTunnelRow#tableId= SeaTunnelRow#kind=INSERT : lmKdb, 1072498088
2023-10-10 08:05:07,283 INFO org.apache.seatunnel.connectors.seatunnel.console.sink.ConsoleSinkWriter - subtaskIndex=1 rowIndex=9: SeaTunnelRow#tableId= SeaTunnelRow#kind=INSERT : iqGva, 918730371
2023-10-10 08:05:07,284 INFO org.apache.seatunnel.connectors.seatunnel.console.sink.ConsoleSinkWriter - subtaskIndex=1 rowIndex=10: SeaTunnelRow#tableId= SeaTunnelRow#kind=INSERT : JMHmq, 1130771733
2023-10-10 08:05:07,284 INFO org.apache.seatunnel.connectors.seatunnel.console.sink.ConsoleSinkWriter - subtaskIndex=1 rowIndex=11: SeaTunnelRow#tableId= SeaTunnelRow#kind=INSERT : rxoHF, 189596686
2023-10-10 08:05:07,284 INFO org.apache.seatunnel.connectors.seatunnel.console.sink.ConsoleSinkWriter - subtaskIndex=1 rowIndex=12: SeaTunnelRow#tableId= SeaTunnelRow#kind=INSERT : OSblw, 559472064
2023-10-10 08:05:07,284 INFO org.apache.seatunnel.connectors.seatunnel.console.sink.ConsoleSinkWriter - subtaskIndex=1 rowIndex=13: SeaTunnelRow#tableId= SeaTunnelRow#kind=INSERT : yTZjG, 1842482272
2023-10-10 08:05:07,284 INFO org.apache.seatunnel.connectors.seatunnel.console.sink.ConsoleSinkWriter - subtaskIndex=1 rowIndex=14: SeaTunnelRow#tableId= SeaTunnelRow#kind=INSERT : RRiMg, 1713777214
2023-10-10 08:05:07,284 INFO org.apache.seatunnel.connectors.seatunnel.console.sink.ConsoleSinkWriter - subtaskIndex=1 rowIndex=15: SeaTunnelRow#tableId= SeaTunnelRow#kind=INSERT : lRcsd, 1626041649
2023-10-10 08:05:07,284 INFO org.apache.seatunnel.connectors.seatunnel.console.sink.ConsoleSinkWriter - subtaskIndex=1 rowIndex=16: SeaTunnelRow#tableId= SeaTunnelRow#kind=INSERT : QrNNW, 41355294
其他操作
要停止您的作业并删除您的 SeaTunnel 部署,您只需:
kubectl delete -f seatunnel-cluster.yaml -n seatunnel
备份 SeaTunnel 配置
kubectl get statefulset seatunnel -n seatunnel -o yaml > statefulset.yaml
还有什么
现在,您已经快速浏览了 SeaTunnel,您可以看到连接器来查找 SeaTunnel 支持的所有源和接收器。或者,如果您想在另一种引擎集群中提交应用程序,请参阅部署。