dolphinscheduler这个调度任务有spark,spark默认支持yarn。
本文主要梳理sparkTask如何支持早k8s部署的思路。
理论上dolphinscheduler只是一个调度平台,和task的resource provider是解耦合的。flink和spark这方面本身设计做的比较好,调试支持local,生产支持k8s,yarn,mesos。
目前ds的task从资源的角度可以分2类:
- ds自带的worker中作为独立的进程,无限制的使用worker的计算资源。如:shell,python;
- 任务提交到远程计算服务执行,本地和远程的计算服务保持连接轮询获取执行结果。如: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
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集群的清理工作。