高效数据同步利器:Apache SeaTunnel实战指南

0 阅读16分钟

在当前实时数据处理与多源数据集成快速发展的背景下,企业对数据同步的实时性、稳定性以及开发效率提出了更高要求。传统的 ETL 工具往往在实时性、扩展性或开发复杂度方面存在一定局限,难以满足现代大数据架构中流批一体的需求。

SeaTunnel 作为一款面向流批一体的数据集成框架,提供了统一的 Source、Transform、Sink 模型,并基于 Flink 或 Spark 引擎实现高性能数据处理能力,使得用户可以通过配置化方式快速构建数据同步与处理任务。

本文将围绕 SeaTunnel 的核心能力,从概述、安装部署、核心概念到典型应用场景进行系统讲解,并结合实际案例(Kafka、MySQL、PostgreSQL CDC 等)帮助读者快速理解其在真实生产环境中的使用方式,同时补充 SeaTunnel Web 的可视化管理能力,构建从开发到运维的一体化认知。

1. SeaTunnel概述

1.1. SeaTunnel简介

SeaTunnel 是一个简单易用的数据集成框架,在企业中,由于开发时间或开发部门不通用,往往有多个异构的、运行在不同的软硬件平台上的信息系统同时运行。数据集成是把不同来源、格式、特点性质的数据在逻辑上或物理上有机地集中,从而为企业提供全面的数据共享。SeaTunnel 支持海量数据的实时同步。它每天可以稳定高效地同步数百亿数据。并已用于近100家公司的生产。

SeaTunnel 的前身是 Waterdrop(中文名:水滴)自2021年10月12日更名为 SeaTunnel。2021年12月9日,SeaTunnel 正式通过 Apache 软件基金会的投票决议,以全票通过的优秀表现正式成为 Apache 孵化器项目。2022年3月18日社区正式发布了首个 Apache 版本v2.1.0。

1.2. 为什么需要SeaTunnel

SeaTunnel 专注于数据集成和数据同步,主要旨在解决数据集成领域的常见问题:

  • 数据源多样:常用数据源有数百种,版本不兼容。 随着新技术的出现,更多的数据源不断出现。 用户很难找到一个能够全面、快速支持这些数据源的工具。
  • 多模态数据集成:除了结构化数据外,用户还需要集成视频、图像、二进制文件、结构化和非结构化文本数据。 但是,现有的数据集成工具主要集中在结构化数据上。
  • 同步场景复杂:数据同步需要支持离线全量同步、离线增量同步、CDC、实时同步、全库同步等多种同步场景。
  • 资源需求高:现有的数据集成和数据同步工具往往需要大量的计算资源或 JDBC 连接资源来完成海量小表的实时同步。 这增加了企业的负担。
  • 缺乏质量和监控:数据集成和同步过程经常会出现数据丢失或重复的情况。 同步过程缺乏监控,无法直观了解任务过程中数据的真实情况。
  • 技术栈复杂:企业使用的技术组件不同,用户需要针对不同组件开发相应的同步程序来完成数据集成。
  • 管理和维护困难:受限于底层技术组件(Flink/Spark)不同,离线同步和实时同步往往需要分开开发和管理,增加了管理和维护的难度。

1.3. SeaTunnel特点

  • 丰富且可扩展的 Connector:SeaTunnel 提供了不依赖于特定执行引擎的 Connector API。 基于该 API 开发的 Connector(Source、Transform、Sink)可以运行在很多不同的引擎上,例如目前支持的SeaTunnel引擎(Zeta)、Flink、Spark等。
  • Connector 插件:插件式设计让用户可以轻松开发自己的 Connector 并将其集成到 SeaTunnel 项目中。 目前,SeaTunnel 支持超过 100 个连接器,并且数量正在激增。
  • 批流集成:基于 SeaTunnel Connector API 开发的 Connector 完美兼容离线同步、实时同步、全量同步、增量同步等场景。 它们大大降低了管理数据集成任务的难度。
  • 分布式快照:支持分布式快照算法,保证数据一致性。
  • 多引擎支持:SeaTunnel 默认使用 SeaTunnel 引擎(Zeta)进行数据同步。 SeaTunnel 还支持使用 Flink 或 Spark 作为 Connector 的执行引擎,以适应企业现有的技术组件。 SeaTunnel 支持 Spark 和 Flink 的多个版本。
  • JDBC复用、数据库日志多表解析:SeaTunnel 支持多表或全库同步,解决了过度JDBC连接的问题; 支持多表或全库日志读取解析,解决了CDC多表同步场景下需要处理日志重复读取解析的问题。
  • 高吞吐量、低延迟:SeaTunnel 支持并行读写,提供稳定可靠、高吞吐量、低延迟的数据同步能力。
  • 完善的实时监控:SeaTunnel 支持数据同步过程中每一步的详细监控信息,让用户轻松了解同步任务读写的数据数量、数据大小、QPS等信息。
  • 支持两种作业开发方法:编码和画布设计。 SeaTunnel Web 项目 github.com/apache/seat… 提供作业、调度、运行和监控功能的可视化管理。

1.4. 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 运行。

2. SeaTunnel安装和使用

2.1. 官网地址

官网地址:seatunnel.incubator.apache.org/zh-CN/

下载地址:seatunnel.incubator.apache.org/zh-CN/downl…

官方文档:seatunnel.incubator.apache.org/zh-CN/docs/…

2.2. 依赖环境

Spark 版本:>= 2.4.0

Flink 版本:>= 1.13.0

Java 版本:1.8

SeaTunnel 版本:2.3.12

2.3. SeaTunnel下载安装

  1. 下载 SeaTunnel。
wget https://archive.apache.org/dist/seatunnel/2.3.12/apache-seatunnel-2.3.12-bin.tar.gz

2. 解压到指定目录。

tar -xzvf apache-seatunnel-2.3.12-bin.tar.gz -C /opt/module/

3. 修改目录名。

mv apache-seatunnel-2.3.12-bin/ seatunnel-2.3.12

4. 安装连接器插件。

./bin/install-plugin.sh

5. 配置环境变量。

#SEATUNNEL_HOME
export SEATUNNEL_HOME=/opt/module/seatunnel-2.3.12
export PATH=$PATH:$SEATUNNEL_HOME/bin

2.4. 配置环境

config/目录下,有个seatunnel-env.sh脚本。

配置文件

这个脚本中声明了SPARK_HOMEFLINK_HOME两个路径。默认情况下 seatunnel-env.sh 中的 SPARK_HOME 和 FLINK_HOME 就是系统环境变量中的 SPARK_HOME 和 FLINK_HOME。在 shell 脚本中:-的意思是如果:-前的内容为空,则替换为后面的。

这里我们可以直接修改为本机真实路径,例如:

FLINK_HOM=/opt/module/flink-1.13.0

2.5. SeaTunnel官网示例

可以先简单跑一个官方 Flink 案例。

config/目录下,创建配置文件example01.conf,并将官网示例,添加到文件中。

env {
  parallelism = 1
  job.mode = "BATCH"
}

source {
  FakeSource {
    plugin_output = "fake"
    row.num = 16
    schema = {
      fields {
        name = "string"
        age = "int"
      }
    }
  }
}

transform {
  FieldMapper {
    plugin_input = "fake"
    plugin_output = "fake1"
    field_mapper = {
      age = age
      name = new_name
    }
  }
}

sink {
  Console {
    plugin_input = "fake1"
  }
}
  1. 开启 Flink 集群(这里我们以单节点为例测试)。
./bin/start-cluster.sh

# Flink启动后,会出现两个进程
8907 StandaloneSessionClusterEntrypoint
9179 TaskManagerRunner
  1. 使用 SeaTunnel 提交任务。
./bin/start-seatunnel-flink-13-connector-v2.sh --config ./config/example01.conf

等待打印 JobID 提示。

  1. 在 Flink WebUI 上,可以查看输出结果。
fields : name, age
types : STRING, INT
row=1 : elWaB, 1984352560
row=2 : uAtnp, 762961563
row=3 : TQEIB, 2042675010
row=4 : DcFjo, 593971283
row=5 : SenEb, 2099913608
row=6 : DHjkg, 1928005856
row=7 : eScCM, 526029657
row=8 : sgOeE, 600878991
row=9 : gwdvw, 1951126920
row=10 : nSiKE, 488708928
row=11 : xubpl, 1420202810
row=12 : rHZqb, 331185742
row=13 : rciGD, 1112878259
row=14 : qLhdI, 1457046294
row=15 : ZTkRx, 1240668386
row=16 : SGZCr, 94186144

3. SeaTunnel核心概念

3.1. SeaTunnel配置文件

SeaTunnel 配置文件的主要格式是HOCON,有关该格式类型的信息,可参考地址:github.com/lightbend/c…,同时,SeaTunnel 也支持JSON格式,需要注意json格式配置文件的文件后缀为.json。同时,SeaTunnel 也提供了以SQL格式,详细可以参考:github.com/apache/seat…

3.1.1. Env

Env 模块主要用于添加引擎可选参数,不管是什么引擎(Zeta、Spark 或 Flink),对应的可选参数应该在这里面填写。

注意,这里按照引擎分享了参数,对于公共参数可以像之前一样配置。对于 Flink 和 Spark 引擎,其参数的具体配置规则可以参考后续章节:JobEnvConfig,或参考官网:seatunnel.incubator.apache.org/zh-CN/docs/…

3.1.2. Source

Source 模块用于定义 SeaTunnel 在哪里检索数据,并将检索数据用于下一步。可以同时定义多个 Source。

目前支持的 Source 可用参数可以参考官网文档:seatunnel.incubator.apache.org/zh-CN/docs/…

3.1.3. Transform

有了 Source 数据,如果需要对数据进行处理的话,可以添加“transform”模块,如果 Source 的数据不需要处理,原样发送到 Sink 的话,则不需要添加“transform”模块,直接Source {} Sink {}可以直接输出。

Transform 参数可以参考官网文档:seatunnel.incubator.apache.org/zh-CN/docs/…

3.1.4. Sink

SeaTunnel 的作用是将数据从一个地方同步到其他地方,所以定义数据如何定入,写入到哪里。通过 SeaTunnel 提供的 Sink 模块,可以快速高效地完成这个操作。

Sink 参数可以参考官网文档:seatunnel.incubator.apache.org/zh-CN/docs/…

3.1.5. 多行文档支持

hocon 支持多行字符串,这样可以包含较长的文本段落,而不必担心换行符或特殊格式。通过将文本括在三层引号"""中来实现。

var = """
Apache SeaTunnel is a
next-generation high-performance,
distributed, massive data integration tool.
"""
sql = """ select * from "table" """

3.1.6. 配置变量替换

在配置文件中,可以定义一些变量,并在运行时替换它们。但是注意仅支持 hocon 格式的文件。

变量使用方法:

  • ${varName},如果变量未传值,则抛出异常。
  • ${varName:default},如果变量未传值,则使用默认值。如果设置默认值则变量需要写在双引号中。
  • ${varName:},如果变量未传值,则使用空字符串。

如果不使用-i设置变量值,也可以通过系统的环境变量传值。例如:

export varName="value with space"

注意事项:

  • 如果值包含特殊字符,如(,需要使用引号'将其括起来。
  • 如果替换变量包含"',需要添加"
  • 值不能包含空格' '。例如,-i jobName='this is a job name',将被替换为job.name = "this"。可以使用环境变量传递带有空格的值。
  • 如果要使用动态参数,可以使用以下格式:-i date=${date + "%Y%m%d"}
  • 不能使用指定系统保留字符,它将不会被-i替换,如:${datebase_name}${schema_name}${schema_full_name}${table_full_name}${primary_key}${unique_key}${field_names}

3.2. Schema

3.2.1. 为什么需要Schema

某些 NoSQL 数据库或消息队列没有严格限制 schema,因此无法通过 api 获取 schema。 这时需要定义一个 schema 来转换为 TableSchema 并获取数据。

3.2.2. 如何使用Schema

相关参数解释,可以参考官网文档:seatunnel.incubator.apache.org/zh-CN/docs/…

source {
  FakeSource { # 模拟Source数据
    parallelism = 2 # 并行度
    plugin_output = "fake" # Source输出标识名为fake
    row.num = 16 # 行数,模块出16条数据
    schema { # 数据结构定义
        table = "FakeDatabase.FakeTable" # 表名
        columns = [ # 字段列表
           {
              name = id
              type = bigint
              nullable = false
              defaultValue = 0
              comment = "primary key id"
           },
           {
              name = name
              type = "string"
              nullable = true
              comment = "name"
           },
           {
              name = age
              type = int
              nullable = true
              comment = "age"
           }
       ]
       primaryKey { # 标识主键
          name = "id"
          columnNames = [id]
       }
       constraintKeys = [ # 字段约束
          {
             constraintName = "unique_name"
             constraintType = UNIQUE_KEY
             constraintColumns = [
                {
                    columnName = "name"
                    sortType = ASC
                }
             ]
          },
       ]
      }
    }
}

以上就是简单的使用 Schema 定义,SeaTunnel 目前支持的数据类型可以参考官网:seatunnel.incubator.apache.org/zh-CN/docs/…

3.3. JobEnvConfig

这一章节描述了 Env 的配置信息,公共参数可以在所有引擎中使用。为了更好的区分引擎参数,其他引擎的附加参数需要携带前缀。在Flink 引擎中,需要使用flink.作为前缀。在 Spark 中,不需要使用任何前缀来修改参数,因为 Spark 官方参数本身就是以spark.开头。

3.3.1. 公共参数

以下参数对所有引擎通用。

3.3.1.1. job.name

该参数配置任务名称。

3.3.1.2. jars

第三方包可以通过jars加载,例如:jars="file://local/jar1.jar;file://local/jar2.jar"

3.3.1.3. job.mode

通过job.mode你可以配置任务是在批处理模式还是流处理模式。例如:job.mode = "BATCH" 或者 job.mode = "STREAMING"

3.3.1.4. checkpoint.interval

获取定时调度检查点的时间间隔(毫秒)。

STREAMING模式下,检查点是必须的,如果不设置,将从应用程序配置文件seatunnel.yaml中获取。 在BATCH模式下,您可以通过不设置此参数来禁用检查点。在Zeta STREAMING模式下,默认值为30000毫秒。

3.3.1.5. checkpoint.timeout

检查点的超时时间(毫秒)。如果检查点在超时之前没有完成,作业将失败。在Zeta中,默认值为30000毫秒。

3.3.1.6. parallelism

该参数配置source和sink的并行度。

3.3.1.7. shade.identifier

指定加密方式,如果您没有加密或解密配置文件的需求,此选项可以忽略。

3.3.2. Zeta 引擎参数

3.3.2.1. job.retry.times

用于控制作业失败时的默认重试次数。默认值为3,并且仅适用于Zeta引擎。

3.3.2.2. job.retry.interval.seconds

用于控制作业失败时的默认重试间隔。默认值为3秒,并且仅适用于Zeta引擎。

3.3.2.3. savemode.execute.location

此参数用于指定在 Zeta 引擎中执行作业时SaveMode执行的时机。 默认值为CLUSTER,这意味着SaveMode在作业提交到集群上之后在集群上执行。 当值为CLIENT时,SaveMode操作在作业提交的过程中执行,使用shell脚本提交作业时,该过程在提交作业的shell进程中执行。使用 rest api 提交作业时,该过程在http请求的处理线程中执行。 请尽量使用CLUSTER模式,因为当CLUSTER模式没有问题时,我们将删除CLIENT模式。

3.3.3. Flink引擎参数

可以参考官方文档:flink.apache.org/

Flink 配置名称SeaTunnel 配置名称
pipeline.max-parallelismflink.pipeline.max-parallelism
execution.checkpointing.modeflink.execution.checkpointing.mode
execution.checkpointing.timeoutflink.execution.checkpointing.timeout

3.3.4. Spark引擎参数

可以参考官方文档:spark.apache.org/

3.4. 连接器

目前,SeaTunnel-2.3.12 版本支持的连接器比较多了,这里不再单独给出示例说明,可以直接参考官网,各种连接器都已给出。

3.4.1. Source

SeaTunnel 可用的 Source 可以参考:seatunnel.incubator.apache.org/zh-CN/docs/…

Source 常用选项,可以参考:seatunnel.incubator.apache.org/zh-CN/docs/…

3.4.2. Sink

SeaTunnel 可用的 Sink 可以参考:seatunnel.incubator.apache.org/zh-CN/docs/…

Sink 常用选项,可以参考:seatunnel.incubator.apache.org/zh-CN/docs/…

3.5. Transform

SeaTunnel 所有 Transform 相关可参考:seatunnel.incubator.apache.org/zh-CN/docs/…

4. 应用案例:Kafka-MySQL

  1. job/(没有可创建,或放在config/,目录没要求)目录下,创建配置文件kafka-mysql.conf
env {
  # 任务名称
  job.name = "kafka-mysql"
  # 任务模式
  job.mode = "STREAMING"
  # 并行度
  parallelism = 1
}

source {
  Kafka {
    # 定义输出数据集名称为KafkaSource
    plugin_output = "KafkaSource"
    # 定义Kafka数据结构
    schema = {
      table = "KafkaSource.t_user"
      columns = [
        {
          name = id
          type = string
          nullable = false
          comment = "primary key id"
        },
        {
          name = name
          type = string
          comment = "这是一个用户名"
        },
        {
          name = age
          type = int
          comment = "年龄字段"
        },
        {
          name = ts
          type = string
          comment = "ts"
        }
      ]
      primaryKey {
        name = "id"
        columnNames = [id]
      }
    }
    # Kafka数据格式
    format = json
    # Kafka的topic、server等配置
    topic = "user_topic"
    bootstrap.servers = "192.168.88.12:9092"
    kafka.config = {
      client.id = client_1
      group.id = "test_group"
      max.poll.records = 500
      auto.offset.reset = "earliest"
      enable.auto.commit = "false"
    }
  }
}

transform {
  FieldMapper {
    # 定义输入数据集名称,表示将KafkaSource数据集作为当前输入
    plugin_input = "KafkaSource"
    # 定义输出数据集名称为MySQLSink
    plugin_output = "MySQLSink"
    # 字段映射
    field_mapper = {
      id = id
      name = username
      ts = ts
    }
    # 或者也可以使用SQL,这里dual表只作占位,查询的表还是以plugin_input为准
    # query = "SELECT id, name AS username, ts FROM dual WHERE age > 12"
  }
}

sink {
  jdbc {
    # 定义输入数据集名称,表示将MySQLSink数据集作为当前输入
    plugin_input = "MySQLSink"
    # MySQL相关参数配置
    url = "jdbc:mysql://192.168.88.12:3306/test?useUnicode=true&characterEncoding=UTF-8&rewriteBatchedStatements=true"
    driver = "com.mysql.cj.jdbc.Driver"
    username = "root"
    password = "Root@123."
    database = test
    table = "t_user"
    primary_keys = ["id"]
    # 是否开启插入更新
    enable_upsert = true
    # 是否自动生成SQL语句
    generate_sink_sql = true
  }
}
  1. 启动 Zookeeper、Kafka。
  2. 启动 SeaTunnel,这里需要等待命令行打印 JobId,说明成功启动。
./bin/start-seatunnel-flink-13-connector-v2.sh --config ./job/kafka-mysql.conf

4. 由于是从 Kafka 获取数据,经过处理转换,将数据存储到数据库表中,所以启动一个 Kafka 生产者,用于发送数据。

./bin/kafka-console-producer.sh --bootstrap-server 192.168.88.12:9092 --topic user_topic

5. 启动一个消费者,确保数据发送成功。注意,这一步可选,只是用于确保数据成功发送到 Kafka 对应 Topic 中。

./bin/kafka-console-consumer.sh --bootstrap-server localhost:9092 --topic user_topic --group default --from-beginning

6. 发送测试数据。

# 一条一条发送,看数据库是否有数据
{"id": "111111", "name": "zhangSan", "age": 12, "ts": "2026-06-12 16:01:00"}
{"id": "222222", "name": "liSi", "age": 13, "ts": "2026-06-12 16:02:00"}
{"id": "333333", "name": "wangWu", "age": 14, "ts": "2026-06-12 16:03:00"}
{"id": "444444", "name": "zhaoLiu", "age": 15, "ts": "2026-06-12 16:04:00"}
{"id": "555555", "name": "zhenQi", "age": 16, "ts": "2026-06-12 16:05:00"}

# 另外,测试一条id相同,更新的数据
{"id": "555555", "name": "zhenQi2", "age": 66, "ts": "2026-06-12 16:55:55"}

5. SeaTunnel-Web

5.1. 前言

首先,这里使用的版本为 SeaTunnel-2.3.8 和 SeaTunnel-Web-1.0.2,之前使用 SeaTunnel-2.3.12 部署,踩了很多坑,并且没有部署成功。发现 SeaTunnel-Web-1.0.2 虽然是最新的,但是发布时间比较早,所以将 SeaTunnel 版本降低到发布时间相近的版本,部署成功。

本章节使用 SeaTunnel-2.3.8 和 SeaTunnel-Web-1.0.2 部署,但是,部署完成后,使用体验一般,而且,只支持 Zeta 引擎,也就是 SeaTunnel 默认引擎,无法将任务提交到 Flink 或 Spark。所以,这里只能出部署步骤,后续使用操作等就不再整理。

5.2. 安装部署

5.2.1. 上传解压

  1. 上传解压
tar -zxvf apache-seatunnel-web-1.0.2-bin.tar.gz -C /opt/module
  1. 目录重命名
mv apache-seatunnel-web-1.0.2-bin/ seatunnel-web-1.0.2/

5.2.2. 初始化数据库

  1. 登录到 MySQL 数据库,创建seatunnel用户并授权
# 创建数据库
CREATE DATABASE seatunnel DEFAULT CHARACTER SET utf8mb4;
# 授权
CREATE USER 'seatunnel' IDENTIFIED BY 'SeaTunnel@123.';
GRANT ALL PRIVILEGES ON seatunnel.* TO 'seatunnel';
FLUSH PRIVILEGES;
  1. 进入到script/目录下,修改配置文件seatunnel_server_env.sh,这里使用root用户执行脚本
export HOSTNAME="192.168.88.12"
export PORT="3306"
export USERNAME="root"
export PASSWORD="Root@123."
  1. 执行初始化数据库脚本init_sql.sh
sh init_sql.sh
  1. 登录 MySQL 进行验证,看是否成功创建出表,以及是否有数据

5.2.3. 修改配置文件

主要是修改数据库连接,以及一个密钥

spring:
  application:
    name: seatunnel
  datasource:
    driver-class-name: com.mysql.cj.jdbc.Driver
    url: jdbc:mysql://192.168.88.12:3306/seatunnel?useSSL=false&useUnicode=true&characterEncoding=utf-8&allowMultiQueries=true&allowPublicKeyRetrieval=true
    username: seatunnel
    password: SeaTunnel@123.

jwt:
  expireTime: 86400
  # 添加一个key,至少32位
  secretKey: "7f97da8846fed829bb8d1fd9f8030f3b"
  algorithm: HS256

5.2.4. 下载数据源

./bin/download_datasource.sh 1.0.2

5.2.5. 拷贝配置文件

这里,需要将 SeaTunnel 中的相关配置文件,拷贝到 SeaTunne-Web 目录下

ln -s /opt/module/seatunnel-2.3.8/config/plugin_config conf/
ln -s /opt/module/seatunnel-2.3.8/connectors/plugin-mapping.properties conf/
ln -s /opt/module/seatunnel-2.3.8/config/hazelcast-client.yaml conf/

5.2.6. 上传MySQL驱动

上传 MySQL 驱动到 SeaTunnel-Web 的lib/目录下

5.2.7. 启动SeaTunnel引擎

之前测试任务时,直接使用的命令行将任务提交到 Flink,这里需要将 SeaTunnel 后台启动。

进入到 SeaTunnel 目录下

./bin/seatunnel-cluster.sh -d

# 会启动一个进程
3314 SeaTunnelServer

5.2.8. 启动SeaTunnel-Web

./bin/seatunnel-backend-daemon.sh start

5.2.9. 访问WebUIl界面

浏览器访问:http://192.168.88.12:8801,进入登录页面,默认用户名:admin,密码:admin。

登录页面

成功登录后,进入到 SeaTunnel-Web 首页。

SeaTunnel-Web 首页

到此,SeaTunnel-Web 就部署成功了。