docker - 如何将应用程序打包到能够在 Kubernetes 中的 Spark 集群上运行的 docker 镜像中?

标签 docker apache-spark kubernetes

我是在 Kubernetes 上运行 Spark 的新手,我有一个非常简单的应用程序,我正在尝试打包以在我设置的 K8s 集群上的 Spark 中运行。我面临的挑战是如何打包我的应用程序以在 Spark 中运行?我从 Spark Operator 在 K8 上安装了 Spark我注意到这些示例使用了图像 gcr.io/spark-operator/spark:v3.0.0

我注意到 Spark documentation提到这个 docker-image-tool.sh 脚本来生成应用程序。但这看起来像是为了定制环境。我只想要一个轻量级镜像,我的应用程序可以使用它在 Spark 集群上运行。不知道如何将它们结合在一起。

所以我从文档中看到了 2 个选项

  1. 使用this docker file作为基础图像。
  2. 使用docker-image-tool.sh脚本。

但我不确定我需要选择哪个选项或何时使用任一选项?为什么要使用其中一种而不是另一种?还有其他选择吗?是否有一个预构建的镜像,我可以将应用程序复制到其中并使用它来运行?

最佳答案

Spark的docker-image-tool.sh是一个用于创建Spark镜像的工具脚本。如果您想要一个轻量级的 Docker 镜像,您只需调整项目附带的 Dockerfile 或编写自己的 Dockerfile - 不要忘记编辑 entrypoint.sh 脚本。

一般来说,将 Spark 应用程序迁移到 Kubernetes 的步骤如下:

  1. 创建一个基础 Spark 图像供您使用。
  2. 将其推送到 Docker 注册表 - 如果您使用的是 minikube,则可以使用 -m 标志将其移动到 minikube 环境。
  3. 编写 Spark 应用程序,将其打包,然后运行 ​​spark-submit 命令。

注意: 如果您对 Kubernetes 投入不多,只是想快速尝试整个平台,您可以通过运行以下命令来代理 kube-api-server:

kubectl proxy

它将开始在 localhost:8001 上为 api 服务器提供服务,然后您可以通过运行如下命令来提交您的 Spark 应用程序

bin/spark-submit \
--master k8s://http:localhost:8001 \ #If you don't specify the protocol here, it'd default to https
--deploy-mode client \ #if you want to go for `cluster mode` then you'd have to set up a service account
--name sparkle \
--class edu.girdharshubham \ 
--conf spark.executor.instances=1 \ #Number of pods
--conf spark.kubernetes.container.image=<your-spark-image>
--conf spark.kubernetes.driver.pod.name="sparkle"
--conf spark.kubernetes.hadoop.configMapName="HADOOP_CONF_DIR"
--conf spark.kubernetes.executor.deleteOnTermination
path/to/jar

在客户端模式下运行的注意事项:

  • 确保您运行上述命令的节点 - 虚拟机 - 可通过 Pod 进行网络寻址
  • executor(pod) 将运行一个 JAVA 进程
  • 默认 Dockerfile 使用 tini - 微小但有效的容器 init
  • spark.kubernetes.executor.deleteOnTermination - 如果您刚刚开始,此conf应该是您的首选conf,默认情况下,如果发生故障或正常终止,pod将被删除。这将帮助您快速调试执行程序 Pod 的情况 - 无论它们是否失败。

关于docker - 如何将应用程序打包到能够在 Kubernetes 中的 Spark 集群上运行的 docker 镜像中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63838521/

相关文章:

尽管 docker-compose.yml 中有不同的 container_name,docker-compose 仍会重新创建正在运行的容器

python - 将两个 float 写入常规 txt 的正确方法

kubernetes - 无法连接到服务器 : x509: certificate is valid for

kubernetes - 证书管理器颁发的证书读取为 "issued by: cert-manager.local"而不是 Let's Encrypt 并且不起作用

docker - 从 dockerfile 编辑文件

linux - su 和 sudo 未安装,但我需要 root 权限才能安装它们

scala - 如何从 Spark 中的 RDD 和数据帧中过滤?

python - Spark toDebugString 在 python 中不好用

kubernetes - 服务解析在 minikube 中不起作用

docker - 在 Docker for Windows 上运行带有卷挂载的 Docker Linux 容器