
点亮⭐️
https://github.com/apache/
点击蓝字 关注我们
随着企业数据规模的快速增长,传统物理机或虚拟机部署Apache DolphinScheduler面临着环境配置复杂、资源利用率低、扩展性差等痛点。特别是在需要运行Spark等大数据计算任务时,手动维护多套环境、处理依赖冲突、应对突发流量等问题更是让运维团队疲于奔命。
Kubernetes云原生部署为这些问题提供了优雅的解决方案——通过容器化实现环境一致性,利用共享存储解决Spark等二进制文件的分发难题,配合自动扩缩容实现资源的弹性利用。
为此,本文将深入探讨在Kubernetes环境中部署Apache DolphinScheduler并集成Spark作业的完整实践,帮助你从零构建一个高可用、易扩展的云原生调度平台。
环境准备

基础部署
helm repo add dolphinscheduler https://dolphinscheduler.apache.org/helmhelm repo update
kubectl create namespace dolphinscheduler
创建自定义的values.yaml文件,关键配置如下:
# 共享存储配置 - 关键配置,用于存储Spark等二进制文件common: sharedStoragePersistence: enabled: true # 必须启用以支持Spark mountPath: "/opt/soft" accessModes: - "ReadWriteMany" storageClassName: "your-storage-class" # 替换为实际的存储类 storage: "20Gi" configmap: # Spark环境变量配置 SPARK_HOME: "/opt/soft/spark" HADOOP_HOME: "/opt/soft/hadoop" HADOOP_CONF_DIR: "/opt/soft/hadoop/etc/hadoop" JAVA_HOME: "/opt/java/openjdk"# 数据库配置(使用外部数据库)externalDatabase: enabled: true host: "your-mysql-host" port: "3306" database: "dolphinscheduler" username: "root" password: "your-password" type: "mysql"# Worker配置worker: replicas: 2 env: WORKER_EXEC_THREADS: "10"
helm install dolphinscheduler dolphinscheduler/dolphinscheduler \ --namespace dolphinscheduler \ --values values.yaml \ --version 3.2.0 # 使用具体版本号
# 查看Pod状态kubectl get pods -n dolphinscheduler# 查看服务kubectl get svc -n dolphinscheduler# 查看PVC状态kubectl get pvc -n dolphinscheduler
Spark集成配置
# 下载Spark 3.2.1为例wget https://archive.apache.org/dist/spark/spark-3.2.1/spark-3.2.1-bin-hadoop2.7.tgz
由于共享存储已挂载到/opt/soft,只需复制到一个Worker Pod即可:
# 复制Spark二进制包到容器kubectl cp spark-3.2.1-bin-hadoop2.7.tgz dolphinscheduler-worker-0:/opt/soft -n dolphinscheduler# 进入容器解压kubectl exec -it dolphinscheduler-worker-0 -n dolphinscheduler bashcd /opt/softtar zxf spark-3.2.1-bin-hadoop2.7.tgzrm -f spark-3.2.1-bin-hadoop2.7.tgzln -s spark-3.2.1-bin-hadoop2.7 spark# 验证Spark安装$SPARK_HOME/bin/spark-submit --version
如果需要使用Spark on YARN模式,还需要配置Hadoop:
# 下载Hadoop二进制包wget https://archive.apache.org/dist/hadoop/common/hadoop-3.3.1/hadoop-3.3.1.tar.gz# 复制到容器kubectl cp hadoop-3.3.1.tar.gz dolphinscheduler-worker-0:/opt/soft -n dolphinscheduler# 解压配置kubectl exec -it dolphinscheduler-worker-0 -n dolphinscheduler bashcd /opt/softtar zxf hadoop-3.3.1.tar.gzrm -f hadoop-3.3.1.tar.gzln -s hadoop-3.3.1 hadoop# 配置Hadoop环境变量(已在values.yaml中配置)export HADOOP_HOME=/opt/soft/hadoopexport HADOOP_CONF_DIR=/opt/soft/hadoop/etc/hadoop
验证Spark任务
首先通过Shell任务验证Spark环境:
在DolphinScheduler Web UI中创建Shell任务:
$SPARK_HOME/bin/spark-submit --class org.apache.spark.examples.SparkPi \ $SPARK_HOME/examples/jars/spark-examples_2.12-3.2.1.jar
检查任务日志是否包含输出Pi is roughly 3.14...。
spark-examples_2.12-3.2.1.jar程序类型:Java
主函数的Class:
org.apache.spark.examples.SparkPi主程序包:
spark-examples_2.12-3.2.1.jar部署方式:local
Master:local[*]
创建Spark SQL任务:
-- 创建测试表CREATE TABLE IF NOT EXISTS test_table ( id INT, name STRING) USING parquet;-- 插入测试数据INSERT INTO test_table VALUES (1, 'test'), (2, 'dolphinscheduler');-- 查询数据SELECT * FROM test_table;
配置参数:
程序类型:SQL
部署方式:local
Master:local[*]
支持的Spark部署模式
根据DolphinScheduler文档,当前Kubernetes部署中对不同Spark模式的支持情况:
高级配置
如果需要预装Spark,可以构建自定义Worker镜像:
FROM dolphinscheduler.docker.scarf.sh/apache/dolphinscheduler-worker:3.2.0# 安装SparkRUN wget https://archive.apache.org/dist/spark/spark-3.2.1/spark-3.2.1-bin-hadoop2.7.tgz && \ tar zxf spark-3.2.1-bin-hadoop2.7.tgz -C /opt/soft && \ rm -f spark-3.2.1-bin-hadoop2.7.tgz && \ ln -s /opt/soft/spark-3.2.1-bin-hadoop2.7 /opt/soft/spark# 设置环境变量ENV SPARK_HOME=/opt/soft/spark
构建并推送镜像:
docker build -t your-registry/dolphinscheduler-worker:spark .docker push your-registry/dolphinscheduler-worker:spark
修改values.yaml:
worker: image: repository: your-registry/dolphinscheduler-worker tag: spark
为Worker配置资源限制:
worker: resources: limits: memory: "8Gi" cpu: "4" requests: memory: "4Gi" cpu: "2"
DolphinScheduler支持基于KEDA的Worker自动扩缩容:
# 安装KEDAkubectl create namespace kedahelm install keda kedacore/keda --namespace keda --version v2.0.0# 启用Worker自动扩缩容helm upgrade dolphinscheduler dolphinscheduler/dolphinscheduler \ --namespace dolphinscheduler \ --set worker.keda.enabled=true \ --set worker.keda.minReplicaCount=1 \ --set worker.keda.maxReplicaCount=10
故障排查
# 查看Worker日志kubectl logs dolphinscheduler-worker-0 -n dolphinscheduler -f# 查看特定任务日志kubectl logs dolphinscheduler-worker-0 -n dolphinscheduler | grep "task"
# 检查PVC状态kubectl get pvc -n dolphinscheduler# 进入容器验证挂载kubectl exec -it dolphinscheduler-worker-0 -n dolphinscheduler bashdf -h | grep opt/softls -la /opt/soft
kubectl exec -it dolphinscheduler-worker-0 -n dolphinscheduler bashecho $SPARK_HOMEecho $HADOOP_HOME$SPARK_HOME/bin/spark-submit --version
问题1:Spark命令找不到
SPARK_HOME环境变量是否正确配置/opt/soft问题2:共享存储无法挂载
问题3:Spark on YARN失败
HADOOP_CONF_DIR指向正确的配置目录生产环境建议
存储配置:使用高性能存储类(如SSD)作为共享存储,提升Spark作业性能
资源配额:为Worker设置合理的资源限制,避免资源争抢
监控告警:配置Pod和作业级别的监控告警
高可用:Master和Worker至少配置2个副本
备份策略:定期备份数据库和资源文件
Notes
本文基于Apache DolphinScheduler 3.2.0版本编写,不同版本可能存在配置差异。Spark-Kubernetes(cluster)原生模式在当前版本中尚不支持,如需此功能需等待后续版本更新。实际部署时请根据具体环境调整配置参数,特别是存储类、数据库连接等环境相关配置。
END

用户案例

迁移实战

最新发版消息

加入社区
关注社区的方式有很多:
同样地,参与Apache DolphinScheduler 有非常多的参与贡献的方式,主要分为代码方式和非代码方式两种。
非代码方式包括:
完善文档、翻译文档;翻译技术性、实践性文章;投稿实践性、原理性文章;成为布道师;社区管理、答疑;会议分享;测试反馈;用户反馈等。
代码方式包括:
查找Bug;编写修复代码;开发新功能;提交代码贡献;参与代码审查等。


你的好友小海豚拍了拍你
并请你帮她点一下“分享”
