Fork me on GitHub

Apache SeaTunnel 指南

本文是一份面向工程师的 Apache SeaTunnel 上手文档,内容覆盖:

  1. SeaTunnel 的定位与原理
  2. 架构组成
  3. 安装与快速上手
  4. 配置文件说明(含示例)
  5. 典型应用场景(如日志采集、数据库同步、湖仓一体场景)

Apache SeaTunnel 上手文档

1. SeaTunnel 简介与定位

Apache SeaTunnel(原名 Waterdrop)是一个 高性能、分布式的海量数据集成框架,支持批处理和流处理两种模式。它的特点是:

  • 支持多种数据源与目标:JDBC、Kafka、Elasticsearch、Hive、ClickHouse、Hudi、Iceberg、Doris 等。
  • 批流一体:同一套配置既能跑批也能跑实时。
  • 插件化架构:Source、Transform、Sink 全部插件化,扩展方便。
  • 低代码配置:通过 YAML/JSON 配置文件即可完成数据管道定义,不需要复杂编程。

可以把它理解为 Apache Flink 生态下的“ETL胶水层”,主打 数据同步 + 数据加工


2. SeaTunnel 架构原理

SeaTunnel 的核心架构采用 Source → Transform → Sink 三段式模型:

          ┌─────────┐
          │ Source  │   数据来源(DB、Kafka、File)
          └────┬────┘
               │
               ▼
          ┌─────────┐
          │Transform│   数据转换(过滤、字段映射、UDF)
          └────┬────┘
               │
               ▼
          ┌─────────┐
          │  Sink   │   数据目标(ES、Doris、HDFS、Kafka)
          └─────────┘

image

执行模式:

  • Seatunnel Engine:SeaTunnel 自带的轻量执行引擎(0依赖,快速上手)。
  • Flink Engine:基于 Flink 提供流批处理能力(生产推荐)。
  • Spark Engine:适合批量离线处理。

一般场景:实时数仓或日志采集用 Flink Engine;离线批处理或开发测试用 Seatunnel Engine。


3. 安装与快速上手

3.1 环境准备

wget https://dlcdn.apache.org/seatunnel/2.3.3/apache-seatunnel-2.3.3-bin.tar.gz
tar -zxvf apache-seatunnel-2.3.3-bin.tar.gz
cd apache-seatunnel-2.3.3

3.2 快速运行一个任务

官方自带 Example,演示 读取 FakeSource → 控制台输出

./bin/seatunnel.sh --config ./examples/seatunnel.streaming.conf.template -e seatunnel

输出类似:

+---------+----------+
| name    | age      |
+---------+----------+
| Alice   | 25       |
| Bob     | 30       |
+---------+----------+

说明 SeaTunnel Engine 已经启动并执行了一个数据管道。


4. 配置文件详解(YAML 示例)

SeaTunnel 的任务用配置文件描述,一个典型的 YAML 文件如下:

env:
  execution.parallelism: 2
  job.mode: BATCH  # 可选:BATCH / STREAMING
  checkpoint.interval: 10000

source:
  - PluginName: Jdbc
    driver: com.mysql.cj.jdbc.Driver
    url: "jdbc:mysql://127.0.0.1:3306/test"
    user: root
    password: root123
    query: "SELECT id, name, age FROM user"

transform:
  - PluginName: Filter
    fields: ["age"]
    condition: "age > 18"

  - PluginName: Replace
    source_field: name
    pattern: "Alice"
    replacement: "ALICE_USER"

sink:
  - PluginName: Console
    parallelism: 1

配置解读:

  1. env:全局运行环境(并行度、批流模式、checkpoint 配置)。
  2. source:数据源,这里是 MySQL。
  3. transform:数据转换,支持 Filter、SQL、UDF 等。
  4. sink:输出目标,这里是控制台(生产中一般是 Hive、Kafka、ES)。

5. 典型应用场景

5.1 日志采集 → Kafka

source:
  - PluginName: File
    path: /var/log/nginx/access.log
    format: json

sink:
  - PluginName: Kafka
    bootstrap.servers: "localhost:9092"
    topic: "nginx_logs"

👉 将 Nginx 日志实时采集到 Kafka,用于后续实时分析。


5.2 MySQL → ClickHouse 同步

source:
  - PluginName: Jdbc
    url: "jdbc:mysql://127.0.0.1:3306/test"
    user: root
    password: root123
    query: "SELECT * FROM orders"

sink:
  - PluginName: Clickhouse
    host: "127.0.0.1:8123"
    database: "dwh"
    table: "orders"
    username: "default"
    password: ""

👉 实现数据库间的数据同步,常见于 ODS → DWD → DWS → APP 的数仓分层。


5.3 数据湖场景(Kafka → Hudi)

source:
  - PluginName: Kafka
    bootstrap.servers: "localhost:9092"
    topic: "user_behavior"
    format: json

sink:
  - PluginName: Hudi
    table.path: "hdfs:///datalake/hudi/user_behavior"
    table.type: "MERGE_ON_READ"
    record.key.field: "user_id"
    partition.path.field: "dt"

👉 将 Kafka 中的实时用户行为数据写入 Hudi 表,便于湖仓一体的实时分析。


6. 总结

Apache SeaTunnel 的优势:

  • 低代码:只需配置文件即可定义 ETL 管道。
  • 生态广泛:支持上百种 Connector,覆盖主流 OLTP/OLAP/流系统。
  • 批流统一:同一配置文件可无缝切换批处理/流处理引擎。

它非常适合:

  • 企业做 数据库同步 / 日志采集 / 数据湖写入
  • 构建 实时数仓跨系统数据打通
  • 替代部分自研的 ETL 脚本,提升可维护性

《SeaTunnel 在企业数仓建设中的应用指南》,场景定位是:
MySQL → Kafka → Flink → Hive/Doris全链路数仓,覆盖 ODS → DWD → DWS → APP 层。


SeaTunnel 在企业数仓建设中的应用指南

1. 场景背景

在企业大数据体系中,数仓一般分为:

  • ODS(操作数据层):保留业务系统的原始数据,保证可追溯性。
  • DWD(明细层):对数据进行清洗、解耦,保证一致性。
  • DWS(汇总层):按主题域进行汇总,支撑指标分析。
  • APP(应用层):面向报表、推荐、风控等业务。

数据链路需求:

  1. 业务数据库 (MySQL)Kafka (日志采集 / 变更同步)。
  2. KafkaHive / Doris (实时数仓建模)。
  3. 支撑 实时大屏 / OLAP 分析 / 离线报表

SeaTunnel 在其中的定位是:

  • 数据 抽取 (Extract):从 MySQL CDC、日志系统采集数据。
  • 数据 转换 (Transform):统一 schema、过滤、脱敏、格式化。
  • 数据 加载 (Load):写入 Kafka、Hive、Doris、Hudi/Iceberg 等。

2. 全链路架构图

          ┌──────────┐
          │  MySQL   │  ← 业务数据(交易、用户、订单)
          └─────┬────┘
                │  (CDC)
        ┌───────▼────────┐
        │   SeaTunnel     │
        │  Source: MySQL  │
        │  Sink: Kafka    │
        └───────┬────────┘
                │
        ┌───────▼────────┐
        │     Kafka       │  ← 数据总线(解耦上下游)
        └───────┬────────┘
                │
        ┌───────▼────────┐
        │   SeaTunnel     │
        │ Source: Kafka   │
        │ Sink: Hive/Doris│
        └───────┬────────┘
                │
        ┌───────▼──────────┐
        │   Hive / Doris    │  ← 数仓分层 (ODS/DWD/DWS/APP)
        └──────────────────┘

3. 实践示例

3.1 MySQL → Kafka (数据采集)

使用 SeaTunnel CDC 插件,实时采集 MySQL 变更。

env:
  execution.parallelism: 2
  job.mode: STREAMING

source:
  - PluginName: MySQL-CDC
    hostname: 127.0.0.1
    port: 3306
    username: root
    password: root123
    database-name: ecommerce
    table-name: orders

sink:
  - PluginName: Kafka
    bootstrap.servers: "localhost:9092"
    topic: "ods_orders"
    format: json

功能:

  • 实时捕获 orders 表的 增删改事件,写入 Kafka 的 ods_orders topic。
  • 对应 ODS 层:保存原始业务数据。

3.2 Kafka → Hive (ODS → DWD 层)

将 Kafka 中的数据清洗后落地 Hive。

env:
  execution.parallelism: 3
  job.mode: STREAMING

source:
  - PluginName: Kafka
    bootstrap.servers: "localhost:9092"
    topic: "ods_orders"
    format: json

transform:
  - PluginName: Filter
    fields: ["order_id", "user_id", "amount", "create_time"]
    condition: "amount > 0"

  - PluginName: Replace
    source_field: user_id
    pattern: "(\\d{3})\\d{4}(\\d{4})"
    replacement: "$1****$2"  # 脱敏处理

sink:
  - PluginName: Hive
    metastore_uri: "thrift://localhost:9083"
    database: dwd
    table: dwd_orders
    save_mode: append

功能:

  • 从 Kafka 读取订单数据。
  • 过滤掉无效订单(amount > 0)。
  • 用户 ID 脱敏
  • 写入 Hive 的 dwd.dwd_orders 表。

3.3 Hive → Doris (DWS/APP 层)

构建聚合层,支撑 OLAP 查询 & 大屏。

env:
  execution.parallelism: 2
  job.mode: BATCH

source:
  - PluginName: Hive
    metastore_uri: "thrift://localhost:9083"
    database: dwd
    table: dwd_orders

transform:
  - PluginName: SQL
    sql: >
      SELECT user_id, COUNT(order_id) AS order_cnt, SUM(amount) AS total_amount
      FROM dwd_orders
      GROUP BY user_id

sink:
  - PluginName: Doris
    fenodes: "localhost:8030"
    table: dws_user_orders
    database: dws
    username: root
    password: ""
    save_mode: overwrite

功能:

  • 对订单进行 用户维度聚合
  • 将结果写入 Doris,支持 秒级查询 / 报表 / 大屏

4. 应用价值

  1. 批流一体:同一份配置可以跑实时和离线,降低开发成本。
  2. 灵活扩展:可接入多种 OLTP/OLAP/湖仓系统。
  3. 插件化架构:Source/Transform/Sink 组件组合即可快速构建 ETL。
  4. 企业级数仓落地:ODS→DWD→DWS→APP 全链路覆盖,替代大量自研脚本。

5. 总结

SeaTunnel 在企业数仓中扮演 数据集成与加工引擎 的角色:

  • 采集层:从 MySQL、日志、消息队列获取原始数据。
  • 加工层:过滤、清洗、脱敏、聚合。
  • 存储层:写入 Hive、Doris、Hudi/Iceberg 等,支撑实时/离线分析。

它能帮助企业快速实现 实时数仓 / 数据湖仓一体,大幅降低 ETL 开发与维护成本。


SeaTunnel 配置文件速查表

《SeaTunnel 常用插件配置速查表》,覆盖 Source、Transform、Sink 三大类。


SeaTunnel 插件配置速查表

1. env(全局配置)

env:
  execution.parallelism: 4     # 并行度
  job.mode: STREAMING           # BATCH 或 STREAMING
  checkpoint.interval: 10000    # 流任务的 checkpoint 间隔(毫秒)
  pipeline.name: "demo_job"     # 任务名称

2. Source 插件(数据源)

2.1 MySQL(JDBC 批量读取)

source:
  - PluginName: Jdbc
    driver: com.mysql.cj.jdbc.Driver
    url: "jdbc:mysql://127.0.0.1:3306/test"
    user: root
    password: root123
    query: "SELECT id, name, age FROM user"
字段 说明
driver JDBC 驱动类
url 数据库连接 URL
user / password 用户名/密码
query 执行的 SQL 语句

2.2 MySQL-CDC(实时变更采集)

source:
  - PluginName: MySQL-CDC
    hostname: 127.0.0.1
    port: 3306
    username: root
    password: root123
    database-name: ecommerce
    table-name: orders
字段 说明
hostname / port MySQL 地址和端口
database-name 监听的数据库
table-name 监听的表
username / password 账号密码

2.3 Kafka

source:
  - PluginName: Kafka
    bootstrap.servers: "localhost:9092"
    topic: "ods_orders"
    format: json
    group.id: seatunnel_group
字段 说明
bootstrap.servers Kafka broker 地址
topic 订阅的 Topic
group.id 消费组 ID
format 数据格式(json/csv/avro)

2.4 File

source:
  - PluginName: File
    path: "/data/input/*.csv"
    format: csv
字段 说明
path 文件路径(支持通配符)
format 数据格式:csv / json / parquet

3. Transform 插件(数据转换)

3.1 Filter(条件过滤)

transform:
  - PluginName: Filter
    fields: ["amount"]
    condition: "amount > 0"

👉 保留 amount > 0 的记录。


3.2 Replace(字符串替换/脱敏)

transform:
  - PluginName: Replace
    source_field: user_id
    pattern: "(\\d{3})\\d{4}(\\d{4})"
    replacement: "$1****$2"

👉 将用户 ID 中间四位脱敏。


3.3 SQL(SQL 转换)

transform:
  - PluginName: SQL
    sql: >
      SELECT user_id, COUNT(*) AS order_cnt
      FROM orders
      GROUP BY user_id

👉 直接在 Transform 中写 SQL 逻辑。


3.4 Convert(类型转换)

transform:
  - PluginName: Convert
    fields:
      amount: DOUBLE
      order_time: TIMESTAMP

👉 将 amount 转换为 DOUBLE,order_time 转换为时间类型。


4. Sink 插件(数据目标)

4.1 Console(调试用)

sink:
  - PluginName: Console
    parallelism: 1

👉 输出到控制台,常用于调试。


4.2 Kafka

sink:
  - PluginName: Kafka
    bootstrap.servers: "localhost:9092"
    topic: "dwd_orders"
    format: json

4.3 Hive

sink:
  - PluginName: Hive
    metastore_uri: "thrift://localhost:9083"
    database: dwd
    table: dwd_orders
    save_mode: append
字段 说明
metastore_uri Hive Metastore 地址
database Hive 数据库
table Hive 表
save_mode append / overwrite

4.4 Doris

sink:
  - PluginName: Doris
    fenodes: "127.0.0.1:8030"
    database: dws
    table: dws_user_orders
    username: root
    password: ""
    save_mode: overwrite

4.5 ClickHouse

sink:
  - PluginName: Clickhouse
    host: "127.0.0.1:8123"
    database: dwh
    table: orders
    username: default
    password: ""

5. 总结

📌 配置套路记忆法

  • env:任务怎么跑(批流模式、并行度、容错)。
  • source:数据从哪里来(MySQL、Kafka、文件…)。
  • transform:数据要不要清洗、加工。
  • sink:数据到哪里去(Hive、Doris、Kafka、ClickHouse…)。

这样,一个完整的 ETL 就拼接出来了。


posted @ 2025-08-29 14:31  stardsd  阅读(313)  评论(0)    收藏  举报