我是在 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 个选项
- 使用this docker file作为基础图像。
- 使用
docker-image-tool.sh
脚本。
但我不确定我需要选择哪个选项或何时使用任一选项?为什么要使用其中一种而不是另一种?还有其他选择吗?是否有一个预构建的镜像,我可以将应用程序复制到其中并使用它来运行?
最佳答案
Spark的docker-image-tool.sh
是一个用于创建Spark镜像的工具脚本。如果您想要一个轻量级的 Docker 镜像,您只需调整项目附带的 Dockerfile 或编写自己的 Dockerfile - 不要忘记编辑 entrypoint.sh
脚本。
一般来说,将 Spark 应用程序迁移到 Kubernetes 的步骤如下:
- 创建一个基础 Spark 图像供您使用。
- 将其推送到 Docker 注册表 - 如果您使用的是 minikube,则可以使用
-m
标志将其移动到 minikube 环境。 - 编写 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/