Overview
首先需要理解 Spark Operator 的基础镜像是 Spark 的镜像,主要原因是 Spark Operator 会在容器中调用 spark-submit
命令来执行 Spark 任务。所以所有的 Spark Jars 等依赖在部署了 Spark Operator 的时候就已经确定了。
那么在 Spark on Kubernetes 的架构里,spark-submit
具体做了什么呢?其实在 spark-submit
主要是根据用户提交的脚本,按照各种 conf,来配置了 Driver Pod,包括 Pod 需要挂载的 Volume 等等,后通过 k8s 的 Java Client,向 Kubernetes 的 ApiServer 发送构建 Driver Pod 的请求,然后后面的事情,spark-submit
一般就不管了,然后如何装配 Executor Pod,就由 Driver 来控制了。
Spark Operator 的版本
Spark Operator 也已经连续发布了多个版本了,而其中使用到的一些 API 也跟 Kubernetes 集群的版本有关,也就是说,不是所有版本的 Spark Operator 都适合所有的 Kubernetes 集群。以我们使用的其中一个 Kubernetes 集群为例。
# kubectl version
Client Version: version.Info{Major:"1", Minor:"8+", GitVersion:"v1.8.15-27+31187439c9b31f", GitCommit:"31187439c9b31f99c93c514462e4157497f6d299", GitTreeState:"clean", BuildDate:"2018-09-17T08:09:01Z", GoVersion:"go1.10.3", Compiler:"gc", Platform:"linux/amd64"}
Server Version: version.Info{Major:"1", Minor:"8+", GitVersion:"v1.8.15-27+31187439c9b31f", GitCommit:"31187439c9b31f99c93c514462e4157497f6d299", GitTreeState:"clean", BuildDate:"2018-09-17T08:09:01Z", GoVersion:"go1.10.3", Compiler:"gc", Platform:"linux/amd64"}
显然这个版本跟新的 Spark Operator 是不完全兼容的,详细也可以看新的 README。
因此,为了满足部署 Spark Operator 在 1.8 的 Kubernetes 集群中,我们需要找到匹配版本的 Spark Operator,否则会有一些不可预见的问题。
Spark Operator Chart
Spark Operator 的 Helm Chart 主要是 Lightbend 公司的团队在维护,下面目前发布的版本。因为 Helm Chart 中默认用的是 Lightbend 提供的 Spark 镜像,所以如果需要定制 Spark 的话,那么好是自行编译。
# helm search 一下
helm search -l incubator/sparkoperator
构建部署 Spark Operator
因为 Spark 在内部的计算平台上运行,我们对 Spark 进行了一些定制,主要是针对 spark-submit
过程的变化,所以我们需要打一个 K8S 1.8 集群可用的 Spark Operator 的镜像,基础镜像当然是内部版本 Spark 的镜像,假设为 spark:v3.0.0-0.0.1
。
然后在 Spark Operator 的项目目录下执行下面的命令,可以得到 Spark Operator 可执行镜像文件 spark-operator:alpha-0.0.1
。
docker build --build-arg SPARK_IMAGE=spark:v3.0.0-0.0.1 -t spark-operator:alpha-0.0.1 .
部署的话,仍然可以通过 helm install
来部署,但是需要仔细阅读可选的选项,具体可以看 Spark Operator Chart 的 README。
helm install incubator/sparkoperator --name sparkoperator --set ingressUrlFormat=localhost --set operatorImageName=spark-operator --set operatorVersion=alpha-0.0.1
然后自定义的 Spark Operator 部署完毕了。