Spark on Kubernetes PodTemplate 的配置
1 Overview
本文主要讲 Apache Spark 在 on Kubernetes 的 PodTemplate 的问题,以及也会讲到 Spark Operator 里关于 PodTemplate 的问题,当然也会讲到 Apache Spark 2.2 on Kubernetes 那个 Fork 的版本,感兴趣的同学可以往下看看。
之前讲过 Apache Spark on Kubernetes 在配置 Pod 的时候的一些限制,比如针对 Pod 的调度,想加个 NodeSelector 或者 Tolerations。这在集群公用,或者有各种类型任务的集群里,是经常会遇到的情况,而在 Spark 2.x 里是很难做到的。
目前新 Release 的版本 2.4.5 还没有支持通过 PodTemplate 来自定义 Pod 的配置,而社区的计划是在 Spark 3.0 的时候将这一 feature 完成,他支持的方式其实也比较简单,就是可以有一个 PodTemplate 的一个文件,去描述 Driver/Executor 的 metadata/spec 字段,这样当然就可以在模板文件里加入跟调度需要的一些字段了,
关于 PodTemplate 可以带来什么呢?比如说其实 Apache Spark 2.2 on Kubernetes 一开始是支持 initContainer 的,当时可以通过 spark.kubernetes.initcontainer.docker.image
来配置 Pod 的 initContainer 但是随着版本的演进,关于 initContainer 的代码已经去掉了,可以想象,如果只通过几个 SparkConf 来配置 initContainer 的话,这样限制实现太多了,SparkConf 的表达能力有限,如果都通过 spark.kubernetes.driver.label.*
这样的 SparkConf 来配置的话,既不灵活,也让 SparkConf 的配置数量急剧膨胀。
那么现在如果用户想通过 initContainer 做一些事情那可以怎么办?在 Spark 2.x 的版本里,应该是没有办法的,除非通过一些迂回的办法来实现原先你想通过 intContainer 达到的目标,比如说将一个文件提交下载到 Volume 并进行挂载这类操作,又或者直接去改下源码。
具体可以参考在 SPARK-24434 Support user-specified driver and executor pod templates 的相关讨论。不论 initContainer 的逻辑怎么样了,至少现在用户可以通过 PodTemplate 来自定义 Pod,当然包括定义需要的 initContainer,以及跟调度相关的一些字段。
2 PodTemplate
实际上,如果是在 Spark Operator 里,本身就支持 Pod Template 的配置 SparkPodSpec,也就是说,像 NodeSelector, Tolerations 之类的,可以在创建 CRD 对象的时候在 YAML 上添加上,比如下面的例子。
apiVersion: sparkoperator.k8s.io/v1beta2
kind: SparkApplication
metadata:
name: spark-pi
namespace: default
spec:
type: Scala
mode: cluster
image: gcr.io/spark/spark:v2.4.5
mainClass: org.apache.spark.examples.SparkPi
mainApplicationFile: local:///opt/spark/examples/jars/spark-examples_2.11-2.4.5.jar
nodeSelector:
key: value
相关文章