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。

  1. $ helm install koord-spark-operator ./spark-operator-chart/ --namespace spark-operator

安装这个chart将创建名为spark-operator的命名空间(如果不存在的情况下),除此之外,helm也会创建一个名为spark-operator的应用并为它设置相应的RBAC权限。安装完成后,你可以通过检查helm的发布状态看到operator已经成功运行。

  1. $ helm status --namespace spark-operator koord-spark-operator

使用Koordinator运行Spark任务

由于Spark的特殊机制,需要k8s的service account来管理Spark的executor驱动副本,因此service account必须经过经过合适的授权。请在提交任务前,执行下面的命令来创建spark-demo命名空间以及名为sparkservice account

  1. $ kubectl apply -f examples/spark-jobs/service-account.yaml

然后,执行下面的命令创建混部的配置文件,这样提交到spark-demo命名空间的任务才会以混部模式运行。请参考教程获取更多有关混部配置的信息。

  1. $ kubectl apply -f examples/spark-jobs/cluster-colocation-profile.yaml

使用如下命令往spark-demo命名空间提交一个Spark TC示例任务:

  1. $ kubectl apply -f examples/spark-jobs/spark-tc-complex.yaml

然后,使用如下命令检查Spark应用的状态。

  1. $ kubectl get sparkapplication -n spark-demo spark-tc-complex

将显示类似如下内容:

  1. NAME STATUS ATTEMPTS START FINISH AGE
  2. 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-cpuColocation Profile成功注入。

  1. apiVersion: v1
  2. kind: Pod
  3. metadata:
  4. labels:
  5. koordinator.sh/qosClass: BE
  6. spark-role: driver
  7. ...
  8. spec:
  9. containers:
  10. - args:
  11. - driver
  12. - --properties-file
  13. - /opt/spark/conf/spark.properties
  14. - --class
  15. - org.apache.spark.examples.SparkTC
  16. - local:///opt/spark/examples/jars/spark-examples_2.12-3.2.1-tc1.2.jar
  17. resources:
  18. limits:
  19. kubernetes.io/batch-cpu: "1000"
  20. kubernetes.io/batch-memory: 3456Mi
  21. requests:
  22. kubernetes.io/batch-cpu: "1000"
  23. kubernetes.io/batch-memory: 3456Mi
  24. ...

总结

Koordinator的帮助下,当pod的资源使用比较空闲的时候,被申请的资源可以重新分配给其他通过超卖机制混部的pods,这将很大程度提高集群的资源利用率。

在我们的实验环境,在提交Spark任务前,我们可以看到集群的可分配资源已全分配出去而实际资源使用率仍处于很低的水平。

  1. $ kubectl describe node
  2. Allocated resources:
  3. Resource Requests
  4. cpu 7620m (95.25%)
  5. $ kubectl top node
  6. NAME CPU(cores) CPU%
  7. cn-hangzhou.your-node-1 1190m 14.8%
  8. cn-hangzhou.your-node-2 1620m 20.25%

当提交混部的Spark任务后,这些没被使用的资源通过batch priority优先级将重新分配给Spark任务的pods。因此,集群的资源利用率提升了一个等级。

  1. $ kubectl top node
  2. NAME CPU(cores) CPU%
  3. cn-hangzhou.your-node-1 4077m 52%
  4. cn-hangzhou.your-node-2 3830m 49%