SeaTunnel 向远程 Zeta 集群提交作业完整指南:Docker / Kubernetes / EKS / Helm 全场景实战

SeaTunnel 向远程 Zeta 集群提交作业完整指南:Docker / Kubernetes / EKS / Helm 全场景实战 数据集成ETL大数据批处理流处理变更数据捕获【免费下载链接】seatunnelSeaTunnel is a multimodal, high-performance, distributed, massive data integration tool.项目地址https://gitcode.com/GitHub_Trending/se/seatunnel点击查看免费下载导读本文是 SeaTunnel 引擎Zeta远程作业提交的实战手册系统讲解如何将 SeaTunnel 作业从本地机器或 CI/CD 流水线提交到远程Zeta 集群而非仅在本地运行。内容覆盖两种核心提交方式--master客户端参数与 REST API、Docker 单节点与多节点集群、Kubernetes 三种访问方式kubectl port-forward、NodePort、LoadBalancer、ConfigMap 作业配置管理以及 Amazon EKS 上的 Helm 部署。读完本文你将掌握 Zeta 集群的网络端口规划5801 / 8080 / 8090、REST API 提交与监控接口的完整用法以及一套可直接复制的故障排查方法论。1. 前置条件向远程 Zeta 集群提交作业前需要满足以下三项基本条件需求说明SeaTunnel 客户端已安装本地拥有 SeaTunnel 目录可执行bin/seatunnel.sh集群可达提交机器能够访问 REST API 端口默认8080作业配置文件就绪HOCON.conf、JSON 或 SQL 格式的作业配置文件需要特别强调的是这里所说的远程集群必须是已经启动运行的 Zeta 集群。Zeta 引擎支持三种部署形态详见 Zeta 安装部署本地模式Local仅用于测试每个任务启动独立进程、混合集群模式Master 与 Worker 同进程、所有节点均可参与选举和分离集群模式Master 与 Worker 分离Master 只负责作业调度、REST API 与任务提交。其中分离集群模式是官方推荐的生产部署方式因为 Master 不运行同步任务负载更小、稳定性更高即使 Worker 节点宕机也不会导致 IMap 状态数据重新分布详见 分离集群模式部署。本文涉及的远程提交适用于混合集群与分离集群两种模式。2. 从本地机器向远程集群提交2.1--master参数Zeta所有 SeaTunnel Zeta 客户端命令均支持--master参数用于指定集群连接地址bin/seatunnel.sh \ --config job.conf \ --master seatunnel://192.168.1.100:5801Zeta 集群内部默认端口为5801与 REST API 端口8080不同。--master参数用于通过 Hazelcast 成员协议直接连接集群。这一点可以从发行包自带的 config/hazelcast.yaml 中得到印证hazelcast.network.port.port: 5801且auto-increment: false端口不会自动递增避免多节点端口冲突。同时该文件中join.tcp-ip.enabled: true并配置了member-list说明 Zeta 默认使用 TCP-IP 成员发现机制在 Kubernetes 部署时则切换到 Kubernetes 服务发现见 deploy/kubernetes/seatunnel/conf/hazelcast-master.yaml 中的join.kubernetes.enabled: true。Hazelcast 客户端通过 5801 端口加入集群成员组后作业会被提交给当前 Active Master 进行调度。2.2 使用 REST API推荐用于自动化场景对于 CI/CD 流水线和脚本推荐使用 REST API 提交避免在构建机或调度机上维护整套 SeaTunnel 客户端curl -X POST http://192.168.1.100:8080/submit-job \ -H Content-Type: application/json \ -d job.jsonREST API 由 Zeta 引擎内嵌的 Jetty 服务提供。这里有两个容易混淆的默认值来源需要注意详见 REST API v2 参考代码默认值enable-http false、port 8080。也就是说如果你使用精简配置文件或删除了enable-http配置Jetty 默认不会启动REST API 与 Web UI 会一起不可用发行包自带的seatunnel.yaml默认写入了enable-http: true和port: 8080。因此直接使用发行包自带配置启动时REST API 通常监听http://host:8080/。参考 config/seatunnel.yaml 中的实际配置seatunnel: engine: http: enable-http: true port: 8080 enable-dynamic-port: falseREST API 仅在作业运行于 Zeta 引擎时可用作业运行在 Flink 或 Spark 引擎上时需要使用对应引擎自身的工具提交和监控作业。3. Docker单节点提交3.1 启动已启用 REST API 的 Zeta 容器docker run -d --name seatunnel \ -p 8080:8080 \ -e ST_DOCKER_MEMBER_COUNT1 \ apache/seatunnel:versionST_DOCKER_MEMBER_COUNT是 SeaTunnel 官方 Docker 镜像约定成员数量的环境变量单节点为 1多节点集群需在所有节点上设置相同的期望成员数让各容器通过 Hazelcast 发现彼此并组成集群。3.2 从容器外部提交作业容器启动后即可在宿主机上通过 REST API 提交一个FakeSource - Console的冒烟作业curl -X POST http://localhost:8080/submit-job \ -H Content-Type: application/json \ -d { env: { job.name: test, job.mode: BATCH }, source: [{ plugin_name: FakeSource, plugin_output: fake, row.num: 10, schema: { fields: { id: int, name: string } } }], transform: [], sink: [{ plugin_name: Console, plugin_input: [fake] }] }请求成功后会返回类似{jobId: 733584788375666689, jobName: test}的 JSON 响应其中jobId是后续查询作业状态、停止作业的唯一标识。3.3 在容器内执行本地 smoke 测试docker run -d --name seatunnel \ -p 8080:8080 \ -v /path/to/your/jobs:/jobs \ apache/seatunnel:version # 在容器内执行 docker exec seatunnel \ /opt/seatunnel/bin/seatunnel.sh --config /jobs/my-job.conf --master local特别注意该命令仅适用于在容器内做快速本地 smoke 测试。它不是向远程 Zeta 集群提交作业因为--master local会在当前容器进程内本地启动作业作业生命周期与容器进程绑定。真正测试远程提交应该使用第 2 节中的--master seatunnel://host:5801或 REST API 方式。4. Docker多节点集群4.1 Docker Compose 示例用 Docker Compose 快速搭建一个 2 节点 Zeta 集群Master Worker两个容器属于同一个 bridge 网络通过 5801 端口互相发现version: 3.8 services: master: image: apache/seatunnel:version container_name: seatunnel-master ports: - 8080:8080 - 5801:5801 environment: ST_DOCKER_MEMBER_COUNT: 2 networks: - st-net worker: image: apache/seatunnel:version container_name: seatunnel-worker environment: ST_DOCKER_MEMBER_COUNT: 2 networks: - st-net depends_on: - master networks: st-net: driver: bridge启动集群docker-compose up -d向 master 提交作业curl -X POST http://localhost:8080/submit-job \ -H Content-Type: application/json \ -d job.json注意只有master容器对外暴露了 5801 和 8080 两个端口worker容器仅加入内部网络st-net这正是REST API 仅需在 Master 节点上对外暴露这一网络规划原则的体现。4.2 网络端口要求Docker端口协议用途5801TCPHazelcast 集群内部成员通信8080TCPREST API作业提交 / 监控需确保 Docker 网络中所有集群成员之间 5801 端口互通。REST API 仅需在 Master 节点上对外暴露。5. Kubernetes作业提交在 Kubernetes 上部署 SeaTunnel 后部署清单与模板见 deploy/kubernetes/seatunnelMaster 使用 StatefulSet 形态提供稳定的 Pod 名称如seatunnel-master-0有三种方式访问 Master 的 REST API。5.1 使用kubectl port-forward开发 / 临时提交将 Master Pod 的 REST 端口转发到本地# 查找 master pod kubectl get pods -n seatunnel # 转发 REST 端口 kubectl port-forward -n seatunnel \ pod/seatunnel-master-0 8080:8080在另一个终端提交作业curl -X POST http://localhost:8080/submit-job \ -H Content-Type: application/json \ -d job.jsonport-forward方式适合开发调试与临时验证但存在两个天然限制空闲超时会断开连接Pod 重建后需重新执行转发命令。5.2 使用 NodePort 服务测试 / 生产若集群通过NodePort服务暴露 Master# 获取 NodePort kubectl get svc -n seatunnel seatunnel-master-rest # 使用节点 IP 和节点端口提交 curl -X POST http://node-ip:node-port/submit-job \ -H Content-Type: application/json \ -d job.json5.3 使用 LoadBalancer 服务在云厂商托管的 Kubernetes 集群如 EKS、GKE、ACK中更推荐使用 LoadBalancerLB_IP$(kubectl get svc -n seatunnel seatunnel-master-rest \ -o jsonpath{.status.loadBalancer.ingress[0].ip}) curl -X POST http://${LB_IP}:8080/submit-job \ -H Content-Type: application/json \ -d job.json注意AWS 的 LoadBalancer 返回的是hostname而非ip此时应改用{.status.loadBalancer.ingress[0].hostname}取值详见第 7.2 节。6. Kubernetes通过 ConfigMap 管理作业配置在集群内运行作业时建议将作业配置文件以 ConfigMap 形式挂载而非打包到镜像中这样修改作业只需更新 ConfigMap 而无需重建镜像。首先创建 ConfigMap以 CDC 作业为例apiVersion: v1 kind: ConfigMap metadata: name: seatunnel-job-config namespace: seatunnel data: cdc-job.conf: | env { job.name cdc-prod job.mode STREAMING checkpoint.interval 30000 } source { MySQL-CDC { ... } } sink { ... }在 Pod spec 中挂载volumeMounts: - name: job-config mountPath: /opt/seatunnel/jobs volumes: - name: job-config configMap: name: seatunnel-job-config通过kubectl exec提交kubectl exec -n seatunnel seatunnel-master-0 -- \ /opt/seatunnel/bin/seatunnel.sh \ --config /opt/seatunnel/jobs/cdc-job.conf这种方式无需从外部网络访问 REST API直接在 Master Pod 内执行客户端命令即可适用于集群网络受限无公网/无 LoadBalancer的场景。7. Amazon EKS / Helm 部署7.1 Helm 安装SeaTunnel 官方 Helm Chart 支持一键部署 Master 与 Worker 分离架构helm repo add seatunnel https://apache.github.io/seatunnel-helm-charts helm repo update helm install seatunnel seatunnel/seatunnel \ --namespace seatunnel \ --create-namespace \ --set master.replicaCount2 \ --set worker.replicaCount4 \ --set master.service.typeLoadBalancerChart 的默认值位于 deploy/kubernetes/seatunnel/values.yaml其中master.replicas与worker.replicas默认均为2且 Master 与 Worker 均配置了基于hazelcast-port5801的 liveness/readiness 探针image.registry默认为apache/seatunnel可通过image.tag指定具体版本。7.2 EKS 获取 Load Balancer 主机名AWS EKS 的 LoadBalancer 服务通常返回 DNS 主机名而非 IPkubectl get svc -n seatunnel seatunnel-master \ -o jsonpath{.status.loadBalancer.ingress[0].hostname}以该主机名作为 API 端点export ST_HOST$(kubectl get svc -n seatunnel seatunnel-master \ -o jsonpath{.status.loadBalancer.ingress[0].hostname}) curl -X POST http://${ST_HOST}:8080/submit-job \ -H Content-Type: application/json \ -d job.json7.3 通过 Helm values 自定义资源配置生产环境通常需要为 Master 与 Worker 分别规划资源配额、副本数以及引擎级配置可以编写独立的 values 文件# values-prod.yaml master: replicaCount: 2 resources: requests: memory: 4Gi cpu: 2 limits: memory: 8Gi cpu: 4 worker: replicaCount: 8 resources: requests: memory: 8Gi cpu: 4 limits: memory: 16Gi cpu: 8 seatunnel: config: engine: backup-count: 2 queue-type: blockingqueue print-execution-info-interval: 60 http: enable-http: true port: 8080应用配置helm upgrade seatunnel seatunnel/seatunnel \ --namespace seatunnel \ -f values-prod.yaml这里的seatunnel.config.engine段最终会渲染为引擎配置并注入 Pod。其中backup-count: 2控制 Hazelcast IMap 状态数据的备份副本数直接影响集群 HA 能力与 Master 节点数量规划建议取max(1, min(5, N/2))N 为 Master 数量queue-type: blockingqueue选择 Pipeline 内部队列实现print-execution-info-interval: 60周期性打印作业执行信息的时间间隔秒http.enable-http: true/http.port: 8080启用 REST API 与 Web UI对应 config/seatunnel.yaml 中的seatunnel.engine.http配置段。8. 网络与端口要求无论采用哪种部署方式Zeta 集群涉及三个核心端口必须提前规划好防火墙、安全组与 Kubernetes NetworkPolicy端口协议使用方注意事项5801TCPHazelcast 集群成员间通信生产环境不要对外暴露8080TCPREST API生产环境建议通过认证网关暴露8090TCPWeb UI可选仅用于管理看板在 Kubernetes 中建议设置 NetworkPolicy 将 5801 端口限制在 SeaTunnel 命名空间内apiVersion: networking.k8s.io/v1 kind: NetworkPolicy metadata: name: seatunnel-internal namespace: seatunnel spec: podSelector: matchLabels: app: seatunnel ingress: - from: - namespaceSelector: matchLabels: name: seatunnel ports: - port: 5801补充说明8080 端口上的 REST API 与 Web UI 由同一个内嵌 Jetty 服务提供见 REST API v2 参考只要 Jetty 未启动两者会一起不可用。若在seatunnel.yaml中配置了enable-dynamic-port: true实际监听端口会在port到port port-range之间自动挑选此时应以启动日志SeaTunnel REST service will start on port xxx为准而不是想当然地使用 8080。9. 提交后的监控与作业生命周期管理REST API 进阶作业提交成功只是第一步。在远程集群场景下通常需要通过 REST API 持续监控作业状态与指标。以下是实际运维中最常用的几个接口完整参考见 REST API v29.1 查询作业状态# 运行中作业列表支持分页 curl http://host:8080/running-jobs?page1rows10 # 指定作业详细信息含 SourceReceivedCount / SinkWriteCount 等指标 curl http://host:8080/job-info/jobId # 已结束作业state 取值FINISHED / CANCELED / FAILED / SAVEPOINT_DONE / UNKNOWABLE curl http://host:8080/finished-jobs/FINISHED?page1rows10/job-info/:jobId返回的指标字段包括SourceReceivedCount源端接收行数、SourceReceivedQPS、SinkWriteCountSink 写入尝试行数、SinkCommittedCountcheckpoint 成功后的已提交行数等作业运行中还可返回diagnostics字段其中pipelines[].restoreCount如果持续增长而jobStatus一直是RUNNING说明作业正处于崩溃重启循环需要结合日志排查。9.2 集群与资源概览# 集群概览totalSlot / runningJobs / pendingJobs 等 curl http://host:8080/overview # Worker 资源快照totalSlots / freeSlots / cpuUsage / memUsage curl http://host:8080/resource/workers # Pending 队列诊断排查作业长时间 WAITING / PENDING 的原因 curl http://host:8080/pending-jobs?limit10prettytrue/pending-jobs是排查资源不足的利器当作业提交后长时间处于PENDING响应中的lackingTaskGroups、failureMessage如NoEnoughResourceException: slot not enough和blockingJobIds可以直接指明缺多少 Slot、被哪些作业占用。9.3 停止作业curl -X POST http://host:8080/stop-job \ -H Content-Type: application/json \ -d {jobId: 733584788375666689, isStopWithSavePoint: false, force: false}参数说明参数是否必传说明jobId是作业 IDisStopWithSavePoint否是否通过 savepoint 方式停止保存当前状态便于后续恢复force否是否强制停止忽略isStopWithSavePoint仅应在异常场景使用因为可能导致检查点数据不完整9.4 上传配置文件提交除 JSON 请求体外REST API 还支持直接上传.confHOCON、.sql、.json文件curl --location http://127.0.0.1:8080/submit-job/upload \ --form config_file/temp/fake_to_console.conf上传大小受seatunnel.engine.http.upload-max-file-size-mb默认 10 MB与upload-max-request-size-mb默认 10 MB限制超出会在解析配置之前被拒绝。注意REST API 不支持 dry-run仅 CLI 提供/submit-job还支持format参数json/hocon/sql默认json以及基于restoreMode/restoreSourceJobId/isStartWithSavePoint的作业恢复能力。10. 故障排查远程提交场景中问题往往出在网络不通、端口未开或资源不足三类。下表总结了常见现象、可能原因与修复方法现象可能原因修复方法8080 端口Connection refusedREST API 未启用或端口错误设置enable-http: true检查port配置Worker 无法加入集群防火墙阻断 5801 端口开放所有集群节点间 TCP 5801kubectl port-forward断开空闲超时或 Pod 重启重新执行 port-forward考虑改用 NodePort作业已提交但状态始终为WAITING无可用 Worker 槽位扩容 Worker 副本数或检查资源配额EKS LoadBalancer 主机名无法解析DNS 传播延迟等待 1–2 分钟用nslookup验证Helm 安装卡在pending-install上次安装失败残留执行helm rollback或helm uninstall后重试补充两个容易被忽略的排查点8080 打不开时先确认 Jetty 是否真的启动seatunnel.engine.http.enable-http或enable-https才是 REST API / Web UI 的开关仅配置hazelcast.yaml中的network.rest-api.enabled不能替代 Jetty 开关详见 REST API v2作业状态WAITING/PENDING时用/pending-jobs拿诊断信息响应中的failureMessage会直接告诉你是否NoEnoughResourceException以及具体缺哪些 TaskGroup 的 Slot。参考REST API v2 完整参考Zeta 引擎安装部署分离集群模式部署SeaTunnel 引擎配置文件示例Hazelcast 集群配置文件示例Kubernetes Helm Chart 默认值Kubernetes 部署 Master Hazelcast 配置赞分享数据集成ETL大数据批处理流处理变更数据捕获【免费下载链接】seatunnelSeaTunnel is a multimodal, high-performance, distributed, massive data integration tool.项目地址https://gitcode.com/GitHub_Trending/se/seatunnel点击查看免费下载相关推荐向远程 Zeta 集群提交 SeaTunnel 作业从 Docker 单机到 Kubernetes/EKS 的完整实战指南向远程 Zeta 集群提交 SeaTunnel 作业从 Docker 单机到 Kubernetes/EKS 的完整实战指南 本文面向需要将 SeaTunnel数据集成ETL大数据批处理流处理变更数据捕获SeaTunnel Zeta 引擎 RESTful API V2 完全指南监控、作业提交与集群运维SeaTunnel Zeta 引擎 RESTful API V2 完全指南监控、作业提交与集群运维 SeaTunnelZeta 引擎内置了一套基于 HTT数据集成ETL大数据批处理流处理变更数据捕获SeaTunnel 集群 Helm 部署实战从 Chart 安装到任务提交完整指南SeaTunnel 集群 Helm 部署实战从 Chart 安装到任务提交完整指南 SeaTunnelApache SeaTunnel是一个多模态、高性能数据集成ETL大数据批处理流处理变更数据捕获创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考