首页 > 解决方案 > Kubernetes 上的 Spark:如何处理丢失的 Config 文件夹

问题描述

我正在尝试在 kubernetes 集群中运行 spark,如此处所述https://spark.apache.org/docs/latest/running-on-kubernetes.html

它适用于一些基本脚本,例如提供的示例。

我注意到配置文件夹尽管被“docker-image-tool.sh”添加到映像构建中,但被配置映射卷的挂载覆盖。

我有两个问题:

  1. spark 使用哪些资源来生成该配置映射或如何编辑它?据我了解,当最后一个 pod 被删除并在创建新 pod 时重新生成时,卷会被删除
  2. 您应该如何处理无法添加到简单配置映射的 spark-env.sh 脚本?

标签: dockerapache-sparkkubernetes

解决方案


关于 Kubernetes 的一个最初不明显的事情是,更改 ConfigMap(一组配置值)不会被检测为对 Deployments 的更改(应如何将 Pod 或一组 Pod 部署到集群上)或引用它的 Pod配置。这种预期可能会导致无意中过时的配置一直持续到 Pod 规范发生更改。这可能包括由于自动缩放事件而新创建的 Pod,甚至在崩溃后重新启动,从而导致整个集群的配置错误和意外行为。

注意:这不会影响作为卷安装的 ConfigMap,这些卷由运行在每个节点上的 kubelet 定期同步。

要更新 configmap,请执行:

$ kubectl replace -f file.yaml

您必须先创建一个 ConfigMap,然后才能使用它。所以我建议先修改configMap,然后重新部署pod。

请注意,使用 ConfigMap 作为subPath卷挂载的容器将不会收到 ConfigMap 更新。

configMap资源提供了一种将配置数据注入 Pod 的方法。存储在 ConfigMap 对象中的数据可以在 configMap 类型的卷中引用,然后由运行在 Pod 中的容器化应用程序使用。

引用 configMap 对象时,您只需在卷中提供其名称即可引用它。您还可以自定义用于 ConfigMap 中特定条目的路径。

当卷中已经使用的 ConfigMap 被更新时,预计的键最终也会被更新。Kubelet 会在每次定期同步时检查挂载的 ConfigMap 是否新鲜。但是,它使用本地基于 ttl 的缓存来获取 ConfigMap 的当前值。这样一来,从 ConfigMap 更新到新的 key 投射到 pod 的总延迟可以达到 kubelet 同步周期(默认为 1 分钟)+ ConfigMaps 缓存的 ttl(默认为 1 分钟) ) 在 kubelet 中。

但我强烈建议您使用Kubernetes Operator for Spark。它支持在 Spark pod 中挂载卷和 ConfigMap 以对其进行自定义,这是 Apache Spark 2.4 版中不可用的功能。

SparkApplication 可以使用可选字段 .spec.sparkConfigMap 指定 Kubernetes ConfigMap 存储 Spark 配置文件,例如 spark-env.sh 或 spark-defaults.conf,其值为 ConfigMap 的名称。假设 ConfigMap 与 SparkApplication 位于相同的命名空间中。K8S 上的 Spark 提供了允许将某些卷类型安装到驱动程序和执行程序 pod 的配置选项。卷是从 Kubernetes 端“交付”的,但它们可以从 Spark 的本地存储中交付。如果没有卷设置为本地存储,Spark 会在 shuffle 和其他操作期间使用临时暂存空间将数据溢出到磁盘。当使用 Kubernetes 作为资源管理器时,将创建 pod 并为 spark.local 中列出的每个目录安装一个 emptyDir 卷。dir 或环境变量 SPARK_LOCAL_DIRS 。如果没有明确指定目录,则创建并适当配置默认目录。

有用的博客:spark-kubernetes-operator


推荐阅读