0.前言

在一个大数据调度系统中,任务和数据的调度与编排是一个非常重要的环节。
在而今的开源时代,使用DolphinScheduler+SeaTunnel这样的黄金组合,可以满足我们对大数据系统建设初期的各种畅想。
作为一名大数据行业的小白,笔者也来演练一下如何在企业内网中如何快速搭建出DolphinScheduler+SeaTunnel,并用一个简单的小示例实践一下。

本文中的部署环境:

  1. k8s,版本1.23.15
  2. helm,版本3.16.2
  3. harbor镜像仓库

1.DolphinScheduler部署

今天是2026年2月12号星期四,目前DolphinScheduler(DS)的最新版本为3.4.0,最新稳定的版本为3.1.9
ds-version

从稳定性的角度出发,本文中也采用DS的稳定版3.1.9。部署时DS参考官方的此连接:https://dolphinscheduler.apache.org/en-us/docs/3.1.9/guide/installation/kubernetes

执行以下命令下载源码:

#克隆DS代码
git clone https://github.com/apache/dolphinscheduler.git
#如果拉不动就配置http代理重新拉
git clone -c http.proxy=http://192.168.1.66:7078 -c https.proxy=http://192.168.1.66:7078 https://github.com/apache/dolphinscheduler.git
#切换到3.1.9的tag
git checkout 3.1.9
#切换到部署脚本目录
cd deploy/kubernetes/dolphinscheduler/

在这里插入图片描述

再执行下面的命令,执行helm操作:

#添加helm仓库源
helm repo add bitnami https://charts.bitnami.com/bitnami
#同步当前目录下的所有chart
helm dependency update .
#如果同步失败,可尝试配置http代理再次同步
HTTP_PROXY=http://192.168.1.66:7078 HTTPS_PROXY=http://192.168.1.66:7078 helm dependency update .

在这里插入图片描述

同步chart成功后会有以上信息输出。

如果上面的命令由于网络原因安装失败,可通过代理先将原镜像下载之后再上传到harbor的方式解决。步骤为:

#查看依赖镜像
helm template . | grep “image:” | awk ‘{print $2}’ | tr -d ‘"’ | sort | uniq

输出为:

busybox:1.30
docker.io/bitnami/postgresql:11.11.0-debian-10-r71
docker.io/bitnami/zookeeper:3.6.2-debian-10-r185
dolphinscheduler.docker.scarf.sh/apache/dolphinscheduler-alert-server:3.1.9
dolphinscheduler.docker.scarf.sh/apache/dolphinscheduler-api:3.1.9
dolphinscheduler.docker.scarf.sh/apache/dolphinscheduler-master:3.1.9
dolphinscheduler.docker.scarf.sh/apache/dolphinscheduler-tools:3.1.9
dolphinscheduler.docker.scarf.sh/apache/dolphinscheduler-worker:3.1.9

得到清单后,我们给docker配置好代理,(命令参考:配置docker的网络代理)。再依次手动拉取:

docker pull dolphinscheduler.docker.scarf.sh/apache/dolphinscheduler-master:3.1.9
docker pull dolphinscheduler.docker.scarf.sh/apache/dolphinscheduler-worker:3.1.9
docker pull dolphinscheduler.docker.scarf.sh/apache/dolphinscheduler-api:3.1.9
docker pull dolphinscheduler.docker.scarf.sh/apache/dolphinscheduler-alert-server:3.1.9
docker pull dolphinscheduler.docker.scarf.sh/apache/dolphinscheduler-tools:3.1.9
docker pull bitnami/postgresql:11.11.0-debian-10-r71
docker pull bitnami/zookeeper:3.6.2-debian-10-r185
docker pull busybox:1.30

再依次打上tag:

export MY_HARBOR="dockerhub.haiyang.com/haiyang"
docker tag dolphinscheduler.docker.scarf.sh/apache/dolphinscheduler-master:3.1.9 $MY_HARBOR/dolphinscheduler-master:3.1.9
docker tag dolphinscheduler.docker.scarf.sh/apache/dolphinscheduler-api:3.1.9 $MY_HARBOR/dolphinscheduler-api:3.1.9
docker tag dolphinscheduler.docker.scarf.sh/apache/dolphinscheduler-alert-server:3.1.9 $MY_HARBOR/dolphinscheduler-alert-server:3.1.9
docker tag dolphinscheduler.docker.scarf.sh/apache/dolphinscheduler-tools:3.1.9 $MY_HARBOR/dolphinscheduler-tools:3.1.9
docker tag docker.io/bitnami/postgresql:11.11.0-debian-10-r71 $MY_HARBOR/postgresql:11.11.0-debian-10-r71
docker tag busybox:1.30 $MY_HARBOR/busybox:1.30
docker tag dolphinscheduler.docker.scarf.sh/apache/dolphinscheduler-worker:3.1.9 $MY_HARBOR/dolphinscheduler-worker:3.1.9
docker tag public.ecr.aws/bitnami/zookeeper:3.6.2-debian-10-r185 $MY_HARBOR/zookeeper:3.6.2-debian-10-r185

再依次push到私服:

docker push $MY_HARBOR/dolphinscheduler-master:3.1.9
docker push $MY_HARBOR/dolphinscheduler-api:3.1.9
docker push $MY_HARBOR/dolphinscheduler-alert-server:3.1.9
docker push $MY_HARBOR/dolphinscheduler-tools:3.1.9
docker push $MY_HARBOR/postgresql:11.11.0-debian-10-r71
docker push $MY_HARBOR/busybox:1.30
docker push $MY_HARBOR/dolphinscheduler-worker:3.1.9
docker push $MY_HARBOR/zookeeper:3.6.2-debian-10-r185

替换values.yamlregistry的镜像仓库地址:

# 执行替换(使用 | 作为定界符,避免仓库地址中的 / 导致冲突)
sed -i "s|registry: \"dolphinscheduler.docker.scarf.sh/apache\"|registry: \"$MY_HARBOR\"|g" values.yaml

postgresqlzookeeper的需要单独处理,编辑values.yaml文件,在各自的节点中添加对应的image配置:

postgresql:
  enabled: true
  image:
    registry: "dockerhub.haiyang.com"
    repository: "haiyang/postgresql"
    tag: "11.11.0-debian-10-r71"
……省略……
zookeeper:
  enabled: true
  image:
    registry: "dockerhub.haiyang.com"
    repository: "haiyang/zookeeper"
    tag: "3.6.2-debian-10-r185"

busybox部分的处理:

#找到对应的模块文件:
grep -r "busybox" templates/
---
templates/_helpers.tpl:  image: busybox:1.30

替换命令:

sed -i “s|image: busybox:1.30|image: $MY_HARBOR/busybox:1.30|g” templates/_helpers.tpl

至此,我们已经完成了dolphinscheduler、postgresql、zookeeper、busybox这些镜像地址的替换。

再修改一下pod中路径配置,从mycluster修改到本地文件(临时修改,重启pod后数据会丢失)

sed -i ‘/resource.hdfs.fs.defaultFS:/ s|hdfs://mycluster:8020|file:///|’ values.yaml

接下来就可以用helm来安装DS了。安装DS到指定的k8s命名空间中:

最终pod状态截图如下,所有pod均ready:
get-pod

测试时,可以用port-forward命令映射出端口验证一下:

kubectl port-forward --address 0.0.0.0 -n test svc/dolphinscheduler-api 12345:12345

或直接将service的类型修改为NodePort

kubectl patch svc dolphinscheduler-api -n bigdata -p ‘{“spec”:{“type”:“NodePort”}}’
get-svc

之后再访问对应的端口,如:http://192.168.1.168:35246/dolphinscheduler/ui
默认用户名和密码为:admin/dolphinscheduler123

登录进去看一下:
ds-web

2.SeaTunnel部署

SeaTunnel(ST)目前的最新版本为2.3.12
为了快速安装,这里也还是使用helm。https://seatunnel.apache.org/docs/2.3.12/start-v2/kubernetes/helm
seatunnel-helm

SeaTunnel官方指定的helm仓库中最新的为2.3.10,我们也使用这个版本的helm进行安装:

export VERSION=2.3.10
#创建seatunnel_helm
mkdir seatunnel_helm
#切换到seatunnel_helm
cd seatunnel_helm
#拉取seatunnel的helm镜像
helm pull oci://registry-1.docker.io/apache/seatunnel-helm --version ${VERSION}
#如果拉取失败可以尝试通过配置代理尝试,如:
HTTP_PROXY=http://192.168.1.66:7078 HTTPS_PROXY=http://192.168.1.66:7078 helm pull oci://registry-1.docker.io/apache/seatunnel-helm --version ${VERSION}
#解压seatunnel的helm包:
tar -xvf seatunnel-helm-${VERSION}.tgz
cd seatunnel-helm

与前面部署DS类似的,部署前也需要将对应的seatunnel镜像拉取并推送到docker的私有仓库中。

#获取出seatunnel这个helm镜像的docker镜像
helm template . | grep "image:" | awk '{print $2}' | tr -d '"' | sort | uniq
#拉取对应的seatunnel镜像
docker pull apache/seatunnel:2.3.10
#定义私有仓库地址
export MY_HARBOR="dockerhub.haiyang.com/haiyang"
#打tag
docker tag apache/seatunnel:2.3.10 $MY_HARBOR/apache/seatunnel:2.3.10
#推送到私服
docker push $MY_HARBOR/apache/seatunnel:2.3.10

再替换helm的values.yaml中的镜像地址:

sed -i “s|registry: “apache/seatunnel”|registry: “$MY_HARBOR/apache/seatunnel”|g” values.yaml

替换好镜像后,安装并启动seatunnel

#安装seatunnel到bigdata这个命名空间中
helm install seatunnel . -n bigdata

最后,再查看一下状态:

kubectl get pod -n bigdata -w
get-pod

SeaTunnelmasterworker都启动就绪了。
get-logs

如果要访问http接口,可直接执行以下命令将8080端口映射出来:

kubectl expose deployment seatunnel-master --type=NodePort --name=seatunnel-web --port=8080 --target-port=8080 -n bigdata

分别运行两个http接口测试一下:

curl http://127.0.0.1:25323/running-jobs
curl http://127.0.0.1:25323/system-monitoring-information
test-http-api

3.DS+ST联合小示例

前面两个步骤,我们已经完成了DolphinSchedulerSeaTunnel 在内网环境中的部署,接下来再用一个小示例验证一下。
ds-node

尽管在DS的界面中也有可以直接运行SeaTunnel的组件,但它要求SeaTunnel和DolphinScheduler需要部署在同一个机器中,这与目前的部署结构不匹配。
但好在SeaTunnel提供了http接口,则我们可以使用http接口的方式向SeaTunnel提交任务。
参考的SeaTunnel接口:submit-a-job

get-svc

其本质在dolphinscheduler的容器中向seatunnel-web这个service发http请求。
为了确保方案的可行性,我们可以先通过手动运行的方式验证下:

kubectl exec -it dolphinscheduler-api-6447777469-dhd8r -n bigdata – bash
curl -X GET http://seatunnel-web:8080/running-jobs

curl-test

确认无误后,再在DS的界面中添加SHELL节点,尝试提交一个SeaTunnelJOB
在SHELL的脚本内容中输入以下内容:

curl -X POST http://seatunnel-web:8080/submit-job \
-H "Content-Type: application/json" \
-d '{
    "env": {
        "job.mode": "batch"
    },
    "source": [
        {
            "plugin_name": "FakeSource",
            "plugin_output": "fake",
            "row.num": 100,
            "schema": {
                "fields": {
                    "name": "string",
                    "age": "int",
                    "card": "int"
                }
            }
        }
    ],
    "transform": [],
    "sink": [
        {
            "plugin_name": "Console",
            "plugin_input": ["fake"]
        }
    ]
}'

截图为:
ds-node-edit

之后再运行此工作流,显示为:
node-view

从日志上可以看出,任务已经提交成功并返回了一个jobId
但需要注意的是,如果是在生产环境中用http的方式提交SeaTunnel的任务还需要做一些额外的处理,这是因为DS 节点的成功/失败状态仅代表“提交成功/失败”,而不是“数据同步成功/失败”,关于此处的详细方案这里不再进一步展开。

如要实现在K8S下比较完备的整合流程,可参考此链接:https://dev.to/chen_debra_3060b21d12b1b0/sync-api-data-to-your-data-lake-with-seatunnel-dolphinscheduler-30aj

Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐