SeaTunnel 集群部署指南
概述
本文档介绍如何在 Ubuntu 24.04 虚拟机上部署 Apache SeaTunnel 集群,采用 1 个 Master + 2 个 Worker 的高可用架构。
架构说明
┌─────────────────┐
│ SeaTunnel │
│ Master │
│ (Coordinator) │
│ 192.168.192.131│
└────────┬────────┘
│
┌────┴────┐
│ │
▼ ▼
┌─────────┐ ┌─────────┐
│ Worker 1│ │ Worker 2│
│192.168. │ │192.168. │
│ 192.132│ │ 192.133│
└─────────┘ └─────────┘
- Master 节点 (192.168.192.131): 负责作业调度、资源管理、Checkpoint 协调
- Worker 节点 (192.168.192.132/133): 负责实际的数据处理任务执行
- 操作系统: Ubuntu 24.04 LTS
- 部署模式: Standalone 集群部署
Linux虚拟机部署方案
适用场景:3 台 Linux 虚拟机,无 Kubernetes 部署模式:Master 和 Worker 角色分离,独立部署
一、架构说明
1. 节点角色分配
明确分工,不混用:
| 节点 | IP 地址 | 角色 | 端口 | 职能说明 |
|---|---|---|---|---|
| 节点 1 | 192.168.192.131 | Master | 5801, 8080 | 协调者,负责任务调度和管理 |
| 节点 2 | 192.168.192.132 | Worker1 | 5801 | 执行者,负责数据处理 |
| 节点 3 | 192.168.192.133 | Worker2 | 5801 | 执行者,负责数据处理 |
为什么角色分离?
- ✅ 职责清晰:Master 专注调度,Worker 专注执行
- ✅ 性能隔离:避免相互影响
- ✅ 易于扩展:后续可单独增加 Worker 节点
- ✅ 便于维护:问题定位更简单
2. 目录规划与磁盘空间
# 所有节点统一使用以下目录
/opt/seatunnel/ # 安装目录(建议 10GB)
/data/seatunnel/ # 数据目录(建议 100GB+,使用 S3 可减小)
/var/log/seatunnel/ # 日志目录(建议 20GB)
磁盘空间详细规划:
| 目录 | Master 节点 | Worker 节点 | 说明 |
|---|---|---|---|
/opt/seatunnel/ | 10 GB | 10 GB | 程序文件 + 插件 + 临时文件 - 安装包解压:~5GB - Connector 插件:~2GB - 运行临时文件:~3GB |
/data/seatunnel/ | 50-100 GB | 50-100 GB | Checkpoint + Savepoint - 本地存储方案:每个作业 10-50GB - S3 存储方案:仅缓存,20GB 足够 - 保留策 略:max-retained: 3 |
/var/log/seatunnel/ | 20 GB | 20 GB | 日志文件 - engine.log:~10GB(保留 7 天) - gc.log:~5GB - job日志:~5GB |
| 总计 | 80-130 GB | 80-130 GB | 建议使用 SSD 硬盘 |
分区建议:
# 推荐的分区方案
/ 50G # 系统分区
/opt 20G # 应用程序
/data 200G+ # 数据分区(单独挂载)
/var 30G # 日志和变量
swap 8-16G # 交换分区(内存的 50%-100%)
磁盘类型选择:
| 场景 | 推荐类型 | 理由 |
|---|---|---|
| 测试环境 | HDD 机械硬盘 | 成本低,满足基本需求 |
| 生产环境 | SSD 固态硬盘 | I/O 性能高,Checkpoint 写入快 |
| 高性能场景 | NVMe SSD | 极低延迟,适合高频 Checkpoint |
空间监控命令:
# 查看磁盘使用情况
df -h /opt/seatunnel /data/seatunnel /var/log/seatunnel
# 查看目录大小
du -sh /opt/seatunnel
du -sh /data/seatunnel
du -sh /var/log/seatunnel
# 查找大文件
find /data/seatunnel -type f -size +1G -exec ls -lh {} \;
自动清理策略(可选):
# 创建清理脚本 /opt/scripts/cleanup-seatunnel.sh
#!/bin/bash
# 删除 7 天前的日志
find /var/log/seatunnel -name "*.log" -mtime +7 -delete
# 删除 3 天前的旧 Checkpoint(如果未配置自动清理)
find /data/seatunnel/checkpoint -type d -mtime +3 -exec rm -rf {} \;
# 删除空目录
find /data/seatunnel -type d -empty -delete
配置定时任务(每天凌晨 2 点执行):
# crontab -e
0 2 * * * /opt/scripts/cleanup-seatunnel.sh
二、前置准备(3 台虚拟机都要执行)
步骤 1:基础环境配置
# 1. 更新软件源
sudo apt update
# 2. 关闭防火墙(测试环境)
sudo ufw disable
# 3. 配置 hosts(3 台机器都要配置)
sudo tee -a /etc/hosts <<EOF
192.168.192.131 seatunnel-master
192.168.192.132 seatunnel-worker1
192.168.192.133 seatunnel-worker2
EOF
# 4. 验证网络互通
ping seatunnel-master
ping seatunnel-worker1
ping seatunnel-worker2
步骤 2:安装 JDK
# Ubuntu 24.04 安装 OpenJDK 17(推荐)
sudo apt install -y openjdk-17-jdk
# 验证
java -version
# 配置 JAVA_HOME(可选)
export JAVA_HOME=/usr/lib/jvm/java-17-openjdk-amd64
export PATH=$JAVA_HOME/bin:$PATH
一、环境准备(所有节点执行)
本章节指导你从零开始配置 SeaTunnel 集群环境,3 台虚拟机都需要执行以下步骤。
步骤 1:更新系统软件源
# 更新软件包列表
sudo apt update
# 升级已安装的软件包(可选但推荐)
sudo apt upgrade -y
步骤 2:配置主机名和 hosts 解析
在每台机器上设置唯一的主机名:
Master 节点 (192.168.192.131):
# 设置主机名
sudo hostnamectl set-hostname seatunnel-master
# 验证
hostname
# 应输出:seatunnel-master
Worker1 节点 (192.168.192.132):
sudo hostnamectl set-hostname seatunnel-worker1
hostname
# 应输出:seatunnel-worker1
Worker2 节点 (192.168.192.133):
sudo hostnamectl set-hostname seatunnel-worker2
hostname
# 应输出:seatunnel-worker2
在所有节点上配置 hosts 解析(3 台机器都要添加):
# 编辑 hosts 文件
sudo tee -a /etc/hosts <<EOF
192.168.192.131 seatunnel-master
192.168.192.132 seatunnel-worker1
192.168.192.133 seatunnel-worker2
EOF
# 验证配置
cat /etc/hosts
步骤 3:关闭防火墙(测试环境)
# Ubuntu 使用 ufw 防火墙
sudo ufw disable
# 验证状态
sudo ufw status
# 应输出:Status: inactive
生产环境建议:如果开启防火墙,需要开放以下端口:
- 5801/tcp (Hazelcast 集群通信)
- 8080/tcp (HTTP API 和 Web UI,仅 Master 需要)
步骤 4:安装 OpenJDK 17
# 安装 OpenJDK 17
sudo apt install -y openjdk-17-jdk
# 验证安装
java -version
# 应输出类似:openjdk version "17.0.x" ...
# 配置 JAVA_HOME 环境变量
echo 'export JAVA_HOME=/usr/lib/jvm/java-17-openjdk-amd64' | sudo tee /etc/profile.d/seatunnel.sh
echo 'export PATH=$JAVA_HOME/bin:$PATH' | sudo tee -a /etc/profile.d/seatunnel.sh
# 使配置生效
source /etc/profile.d/seatunnel.sh
# 验证
env | grep JAVA_HOME
步骤 5:创建必要的目录结构
这是关键步骤! SeaTunnel 不会自动创建这些目录,需要手动创建:
# 1. 创建安装目录(存放 SeaTunnel 程序)
sudo mkdir -p /opt/seatunnel
# 2. 创建数据目录(存放 Checkpoint 和 Savepoint)
sudo mkdir -p /data/seatunnel/{checkpoint,savepoint,tmp}
# 3. 创建日志目录(存放运行日志)
sudo mkdir -p /var/log/seatunnel
# 4. 设置目录权限(授予当前用户读写权限)
sudo chown -R $USER:$USER /opt/seatunnel /data/seatunnel /var/log/seatunnel
# 5. 验证目录结构
ls -lh /opt/seatunnel
ls -lh /data/seatunnel/
ls -lh /var/log/seatunnel
目录用途说明:
| 目录路径 | 用途 | 空间建议 |
|---|---|---|
/opt/seatunnel/ | SeaTunnel 程序安装目录 | 10GB |
/data/seatunnel/checkpoint/ | Checkpoint 数据存储 | 50-100GB(本地存储方案) |
/data/seatunnel/savepoint/ | Savepoint 数据存储 | 20-50GB |
/data/seatunnel/tmp/ | 临时文件和缓存 | 20GB |
/var/log/seatunnel/ | 日志文件 | 20GB |
步骤 6:验证网络连通性
# 在 Master 节点上测试
ping seatunnel-worker1 -c 4
ping seatunnel-worker2 -c 4
# 在 Worker 节点上测试
ping seatunnel-master -c 4
二、下载并安装 SeaTunnel(所有节点执行)
# 下载安装包(3 台机器都执行)
cd /tmp
wget https://archive.apache.org/dist/seatunnel/2.3.10/apache-seatunnel-2.3.10-bin.tar.gz
# 解压到安装目录
sudo tar -xzf apache-seatunnel-2.3.10-bin.tar.gz -C /opt/seatunnel --strip-components=1
# 验证安装
ls -lh /opt/seatunnel/
# 应看到 bin/, config/, lib/, plugins/ 等目录
# 清理安装包
rm -f /tmp/apache-seatunnel-2.3.10-bin.tar.gz
三、配置 Master 节点(仅 192.168.192.131 执行)
重要:本节只在 Master 节点 (192.168.192.131) 上执行,Worker 节点不需要!
步骤 1:编辑配置文件
在 Master 节点上编辑 /opt/seatunnel/config/seatunnel.yaml:
# 打开配置文件(使用 nano 编辑器,新手友好)
sudo nano /opt/seatunnel/config/seatunnel.yaml
删除文件原有内容,完整替换为以下配置:
seatunnel:
engine:
# 标识这是 Master 节点
master-node: true
# 集群配置
hazelcast:
cluster-name: seatunnel-cluster
network:
port: 5801
port-auto-increment: false
join:
multicast:
enabled: false
tcp-ip:
enabled: true
member-list: |
192.168.192.131:5801
192.168.192.132:5801
192.168.192.133:5801
# Checkpoint 配置(只在 Master 配置)
checkpoint:
interval: 300000
timeout: 60000
storage:
type: s3 # 可 选:local 或 s3
max-retained: 3
plugin-config:
# === 方案 1:使用 S3 存储(推荐生产环境)===
storage.type: s3
namespace: "/seatunnel/checkpoint"
s3.bucket: "s3a://your-checkpoint-bucket"
fs.defaultFS: "s3a://your-checkpoint-bucket"
fs.s3a.endpoint: "http://192.168.192.111:9000" # MinIO/S3 端点
fs.s3a.path.style.access: true
fs.s3a.access.key: "your-access-key"
fs.s3a.secret.key: "your-secret-key"
fs.s3a.aws.credentials.provider: org.apache.hadoop.fs.s3a.SimpleAWSCredentialsProvider
# === 方案 2:使用本地存储(测试环境)===
# 如果要用本地存储,删除上面 S3 配置,取消下面注释:
# storage.type: local
# namespace: "/data/seatunnel/checkpoint"
# Web UI 和 API 配置
http:
enable-http: true
port: 8080
enable-basic-auth: true
basic-auth-username: "admin"
basic-auth-password: "admin123"
步骤 2:保存并退出
在 nano 编辑器中:
- 按
Ctrl + O保存文件 - 按
Enter确认文件名 - 按
Ctrl + X退出编辑器
四、配置 Worker 节点(192.168.192.132 和 192.168.192.133 执行)
重要:本节在两个 Worker 节点上都执行!
步骤 1:编辑配置文件
在 Worker1 (192.168.192.132) 上执行:
sudo nano /opt/seatunnel/config/seatunnel.yaml
在 Worker2 (192.168.192.133) 上也执行相同的操作:
sudo nano /opt/seatunnel/config/seatunnel.yaml
步骤 2:配置 Worker 节点
删除文件原有内容,完整替换为以下配置(两个 Worker 节点配置完全相同):
seatunnel:
engine:
# 标识这是 Worker 节 点
master-node: false
# 集群配置(与 Master 相同)
hazelcast:
cluster-name: seatunnel-cluster
network:
port: 5801
port-auto-increment: false
join:
multicast:
enabled: false
tcp-ip:
enabled: true
member-list: |
192.168.192.131:5801
192.168.192.132:5801
192.168.192.133:5801
步骤 3:保存配置文件
在 nano 编辑器中:
- 按
Ctrl + O保存 - 按
Enter确认 - 按
Ctrl + X退出
注意:Worker 节点不需要配置 checkpoint 和 http 部分
五、启动集群
方式 1:前台启动(适合调试)
Master 节点:
cd /opt/seatunnel
./bin/seatunnel.sh --master
Worker 节点(分别在 121 和 122 上执行):
cd /opt/seatunnel
./bin/seatunnel.sh --worker
方式 2:后台启动(简单实用)
Master 节点:
cd /opt/seatunnel
nohup ./bin/seatunnel.sh --master > /var/log/seatunnel/startup.log 2>&1 &
# 查看进程
ps aux | grep seatunnel
Worker 节点:
cd /opt/seatunnel
nohup ./bin/seatunnel.sh --worker > /var/log/seatunnel/startup.log 2>&1 &
方式 3:Systemd 管理(推荐,可开机自启)
Master 节点创建服务文件 /etc/systemd/system/seatunnel-master.service:
[Unit]
Description=SeaTunnel Master
After=network.target
[Service]
Type=forking
User=root
Environment="JAVA_HOME=/usr/lib/jvm/java-17-openjdk-amd64"
ExecStart=/opt/seatunnel/bin/seatunnel.sh --master
ExecStop=/opt/seatunnel/bin/stop.sh
Restart=on-failure
RestartSec=10
[Install]
WantedBy=multi-user.target
Worker 节点创建服务文件 /etc/systemd/system/seatunnel-worker.service:
[Unit]
Description=SeaTunnel Worker
After=network.target
[Service]
Type=forking
User=root
Environment="JAVA_HOME=/usr/lib/jvm/java-17-openjdk-amd64"
ExecStart=/opt/seatunnel/bin/seatunnel.sh --worker
ExecStop=/opt/seatunnel/bin/stop.sh
Restart=on-failure
RestartSec=10
[Install]
WantedBy=multi-user.target
启动服务(所有节点):
# 重载 systemd
sudo systemctl daemon-reload
# 启动服务
sudo systemctl start seatunnel-master # Master 节点
sudo systemctl start seatunnel-worker # Worker 节点
# 设置开机自启
sudo systemctl enable seatunnel-master
sudo systemctl enable seatunnel-worker
# 查看状态
sudo systemctl status seatunnel-master
sudo systemctl status seatunnel-worker
六、验证集群
启动完成后,在 Master 节点上执行以下验证步骤:
1. 检查集群成员
在 Master 节点执行:
# 查看集群成员
curl http://192.168.192.131:8080/hazelcast/cluster-members
# 预期看到 3 个成员
# Members [3] {
# Member [192.168.192.131]:5801 - this
# Member [192.168.192.132]:5801
# Member [192.168.192.133]:5801
# }
2. 查看日志
# 实时查看日志
tail -f /opt/seatunnel/logs/seatunnel-engine.log
# 查看启动日志
tail -100 /opt/seatunnel/logs/seatunnel-engine.log
3. 访问 Web UI
浏览器访问:http://192.168.192.131:8080
- 用户名:
admin - 密码:
admin123
七、提交测试作业
集群验证成功后,可以提交一个简单的测试作业。在 Master 节点上执行:
创建测试作业文件
在 Master 节点创建 /opt/seatunnel/jobs/test.conf:
env {
parallelism = 2
job.mode = "BATCH"
job.name = "test-job"
}
source {
FakeSource {
result_table_name = "fake"
row.num = 1000
schema = {
fields {
id = int
name = string
}
}
}
}
sink {
Console {
source_table_name = "fake"
}
}
提交作业
# 通过 REST API 提交
curl -X POST http://192.168.192.131:8080/submit-job \
-F "config_file=@/opt/seatunnel/jobs/test.conf" \
-F "jobName=test-job"
# 查看运行中的作业
curl http://192.168.192.131:8080/running-jobs
# 停止作业(替换 <jobId> 为实际 ID)
curl -X POST http://192.168.192.131:8080/stop-job \
-H "Content-Type: application/json" \
-d '{"jobId": <jobId>, "isStopWithSavePoint": false}'