colocation-of-spark-jobs
Spark任务混部
Apache Spark
是在大数据,SQL分析,机器学习领域广泛使用的大数据处理分析引擎。此文提供了使用Koordinator将Spark任务和其他延迟敏感应用混合部署的快速指南,以此来提升集群的资源利用率。了解更多关于如何使用、组合和扩展Koordinator混部的信息,请参考简介
必要条件
Koordinator组件
提交混部spark任务之前,需要确认所有Koordinator
组件已经成功安装。请参考安装指南。
为Apache Spark安装Kubernetes Operator
为了方便在集群中提交Spark任务,本文引入Kubernetes Operator,使用用户自定义资源(CRD)管理Spark应用。
根据Helm chart的帮助文档,可以很方便地使用下面的命令安装Spark Operator。
$ helm install koord-spark-operator ./spark-operator-chart/ --namespace spark-operator
安装这个chart
将创建名为spark-operator
的命名空间(如果不存在的情况下),除此之外,helm
也会创建一个名为spark-operator
的应用并为它设置相应的RBAC权限。安装完成后,你可以通过检查helm
的发布状态看到operator
已经成功运行。
$ helm status --namespace spark-operator koord-spark-operator
使用Koordinator运行Spark任务
由于Spark的特殊机制,需要k8s的service account
来管理Spark的executor
驱动副本,因此service account
必须经过经过合适的授权。请在提交任务前,执行下面的命令来创建spark-demo
命名空间以及名为spark
的service account
。
$ kubectl apply -f examples/spark-jobs/service-account.yaml
然后,执行下面的命令创建混部的配置文件,这样提交到spark-demo
命名空间的任务才会以混部模式运行。请参考教程获取更多有关混部配置的信息。
$ kubectl apply -f examples/spark-jobs/cluster-colocation-profile.yaml
使用如下命令往spark-demo
命名空间提交一个Spark TC
示例任务:
$ kubectl apply -f examples/spark-jobs/spark-tc-complex.yaml
然后,使用如下命令检查Spark应用的状态。
$ kubectl get sparkapplication -n spark-demo spark-tc-complex
将显示类似如下内容:
NAME STATUS ATTEMPTS START FINISH AGE
spark-tc-complex RUNNING 1 2022-03-30T09:11:22Z <no value> 14s
现在,提交到spark-demo
命名空间的所有pods都将切换到混部状态。比如,检查名为spark-driver
的pod的yaml,我们将看到标签koordinator.sh/qosClass: BE
以及kubernetes.io/batch-cpu
被Colocation Profile
成功注入。
apiVersion: v1
kind: Pod
metadata:
labels:
koordinator.sh/qosClass: BE
spark-role: driver
...
spec:
containers:
- args:
- driver
- --properties-file
- /opt/spark/conf/spark.properties
- --class
- org.apache.spark.examples.SparkTC
- local:///opt/spark/examples/jars/spark-examples_2.12-3.2.1-tc1.2.jar
resources:
limits:
kubernetes.io/batch-cpu: "1000"
kubernetes.io/batch-memory: 3456Mi
requests:
kubernetes.io/batch-cpu: "1000"
kubernetes.io/batch-memory: 3456Mi
...
总结
在Koordinator
的帮助下,当pod的资源使用比较空闲的时候,被申请的资源可以重新分配给其他通过超卖机制混部的pods,这将很大程度提高集群的资源利用率。
在我们的实验环境,在提交Spark
任务前,我们可以看到集群的可分配资源已全分配出去而实际资源使用率仍处于很低的水平。
$ kubectl describe node
Allocated resources:
Resource Requests
cpu 7620m (95.25%)
$ kubectl top node
NAME CPU(cores) CPU%
cn-hangzhou.your-node-1 1190m 14.8%
cn-hangzhou.your-node-2 1620m 20.25%
当提交混部的Spark
任务后,这些没被使用的资源通过batch priority
优先级将重新分配给Spark
任务的pods。因此,集群的资源利用率提升了一个等级。
$ kubectl top node
NAME CPU(cores) CPU%
cn-hangzhou.your-node-1 4077m 52%
cn-hangzhou.your-node-2 3830m 49%