部署 Kyuubi

在 Kubernetes 上部署 Kyuubi 引擎

师成师成· 更新于 2026-09-29· 阅读 9 分钟· 0 次阅读

登录后可跨设备保存划线和私人笔记登录

前提条件

当你想在 Kubernetes 上运行 Kyuubi 的 Spark SQL 引擎时,最好先了解以下内容。

配置

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 上运行。

评论

登录后参与评论

正在加载评论…