K8S环境部署 seatunnel 服务

说明

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工作流程图

K8S环境部署 seatunnel 服务_seatunnel web
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 支持的所有源和接收器。或者,如果您想在另一种引擎集群中提交应用程序,请参阅部署。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

奔跑、在路上

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值