0%

如何让DolphinScheduler的Spark任务支持K8S部署

dolphinscheduler这个调度任务有spark,spark默认支持yarn。
本文主要梳理sparkTask如何支持早k8s部署的思路。

理论上dolphinscheduler只是一个调度平台,和task的resource provider是解耦合的。flink和spark这方面本身设计做的比较好,调试支持local,生产支持k8s,yarn,mesos。

目前ds的task从资源的角度可以分2类:

  1. ds自带的worker中作为独立的进程,无限制的使用worker的计算资源。如:shell,python;
  2. 任务提交到远程计算服务执行,本地和远程的计算服务保持连接轮询获取执行结果。如:http,sql,procedure,mapreduce,spark,sqoop,flink等。

在云原生时代,
第1类任务:只需要制作对应的镜像,直接提交即可。
第2类任务:需要对应的task类型支持k8s部署,比如spark on k8s ,flink on k8s,然后客户端提交需要做各种pvc的配置。

目前只hive,sqoop,mapreduce等都是继承AbstractYarnTask。
和具体的实现绑定,应该是定义远程计算执行的task接口,task中根据需要,组合yarn或k8s等实现。

环境说明

  • dolphinscheduler版本:1.3.6
  • spark版本:3.1.2

如何让DolphinScheduler的Spark任务支持K8S部署

apiserver

向k8s提交任务,需要新增以下基础配置

  • kubeconfig:包含k8s的token,k8s-client初始化需要
  • master:k8s apiserver的地址
  • image:制作好的镜像,提交到harbor的地址

另外SparkParameters需要新增

  • deployMode:kubernetes
  • sparkVersion:spark3

worker

由于我采用的是spark native方式,不是google的spark on k8s operator。
所以worker主要问题是拼接sparkTask的spark-submit命令。
具体配置内容参考xmind脑图

另外可新增1个spark_on_k8s.json配置文件定义环境参数 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
{
"k8sNameSpace": "spark",
"sparkAppServiceAccountName": "spark",
"sparkAppDriverImage": "bigdata/spark:latest",
"sparkEventLogEnabled": "true",
"pvcConfig": {
"EVENTLOG": {
"name": "spark-log",
"mountPath": "/spark/spark-eventlog",
"subPath": "spark-eventlog",
"readonly": false
},
"CONFIG": {
"name": "spark-config",
"mountPath": "/spark/config",
"readonly": true
},
"APPLICATION": {
"name": "spark-application",
"mountPath": "/spark/application",
"readonly": false
}
},
"sparkVersion": "3",
"hiveMetastoreVersion": "1.1",
"hiveMetastoreJars": "path",
"hiveMetastoreJarsPath": "file:///opt/cdh/lib/hive/lib/*.jar,file:///opt/cdh/lib/hadoop/client/*.jar"
}

master

sparkTask执行的worker容错时,master会对worker执行容错,kill所有正在执行的task。
所以master也需要加载worker一样的配置,在容错时执行spark k8s集群的清理工作。

参考