在 Kubernetes 上部署 Kyuubi 引擎
前提条件
当你想在 Kubernetes 上运行 Kyuubi 的 Spark SQL 引擎时,最好先了解以下内容。
- 阅读 在 Kubernetes 上运行 Spark
- 一个可用的 Kubernetes 集群
- kubectl
- 目标集群的 kubeconfig
配置
Master
在 Kubernetes 上运行 Spark 时,spark.master 使用一种特殊的格式进行配置。
spark.master=k8s://https://<k8s-apiserver-host>:<k8s-apiserver-port>
你可以使用命令 kubectl cluster-info 获取 api-server 的主机和端口。
部署模式
Kyuubi 服务端相较于其他交互式 Spark 客户端的一个主要优势在于,它支持集群部署模式。这意味着 Spark Driver 运行在一个独立的 Pod 中,与 Kyuubi 服务端的 Pod 相隔离。强烈建议在 K8s 上以集群模式运行 Spark。
所需的最小配置如下:
- spark.submit.deployMode cluster
- spark.kubernetes.file.upload.path(S3 或 HDFS 上的路径)
- spark.kubernetes.authenticate.driver.serviceAccountName(参见 ServiceAccount)
Docker 镜像
Spark 提供了 ./bin/docker-image-tool.sh 脚本,用于构建和发布在 Kubernetes 上运行 Spark 应用程序所需的 Docker 镜像。
在针对 Kubernetes 集群部署 Kyuubi 引擎时,我们需要先在 Docker 镜像仓库中准备好相应的 Docker 镜像。
用法示例如下:
./bin/docker-image-tool.sh -r <repo> -t <tag> build
./bin/docker-image-tool.sh -r <repo> -t <tag> push
# To build docker image with specify openJdk
./bin/docker-image-tool.sh -r <repo> -t <tag> -b java_image_tag=<openjdk:${java_image_tag}> build
# To build additional PySpark docker image
./bin/docker-image-tool.sh -r <repo> -t <tag> -p ./kubernetes/dockerfiles/spark/bindings/python/Dockerfile build
# To build additional SparkR docker image
./bin/docker-image-tool.sh -r <repo> -t <tag> -R ./kubernetes/dockerfiles/spark/bindings/R/Dockerfile build测试集群
你可以使用以下 shell 命令来测试集群是否正常。
$SPARK_HOME/bin/spark-submit \
--master k8s://https://<k8s-apiserver-host>:<k8s-apiserver-port> \
--class org.apache.spark.examples.SparkPi \
--conf spark.executor.instances=5 \
--conf spark.dynamicAllocation.enabled=false \
--conf spark.shuffle.service.enabled=false \
--conf spark.kubernetes.container.image=<spark-image> \
local://<path_to_examples.jar>运行 shell 时,你可以使用命令 kubectl describe pod <podName> 来检查信息是否符合预期。
ServiceAccount
使用客户端模式提交应用时,Spark driver 会使用 kubeconfig 访问 Kubernetes API server,以创建和监控 executor pod。
使用集群模式提交应用时,Spark driver pod 会使用 ServiceAccount 访问 Kubernetes API server,以创建和监控 executor pod。
在这两种情况下,你都需要确认自己在对应的 namespace 下是否拥有相应权限。你可以使用以下命令创建 ServiceAccount。
# create ServiceAccount
kubectl create serviceaccount spark -n <namespace>
# binding role
kubectl create clusterrolebinding spark-role --clusterrole=edit --serviceaccount=<namespace>:spark --namespace=<namespace>数据卷
众所周知,Kubernetes 可以通过配置将数据卷挂载到 driver 和 executor 的 Pod 中。
- hostPath:将宿主机节点文件系统中的文件或目录挂载到 Pod 中。
- emptyDir:在 Pod 被分配到节点时创建的一个初始为空的数据卷。
- nfs:将已有的 NFS(网络文件系统)挂载到 Pod 中。
- persistentVolumeClaim:将持久化卷(PersistentVolume)挂载到 Pod 中。
注意:关于与数据卷挂载相关的安全问题,请参阅安全章节。
spark.kubernetes.driver.volumes.<type>.<name>.options.path=<dist_path>
spark.kubernetes.driver.volumes.<type>.<name>.mount.path=<container_path>
spark.kubernetes.executor.volumes.<type>.<name>.options.path=<dist_path>
spark.kubernetes.executor.volumes.<type>.<name>.mount.path=<container_path>欲了解卷(Volumes)的更多信息,请参阅使用 Kubernetes 卷。
PodTemplateFile
Kubernetes 允许通过模板文件来定义 Pod。Spark 用户同样可以使用模板文件来定义 Spark 配置所不支持的 Driver 或 Executor Pod 配置。
为此,请指定 Spark 属性 spark.kubernetes.driver.podTemplateFile 和 spark.kubernetes.executor.podTemplateFile,使其指向 spark-submit 进程可以访问的本地文件。
其他
有关更多信息,请参阅 Spark 官方文档在 Kubernetes 上运行。
评论
登录后参与评论
KnowForge