概述

Spark Operator 概述

什么是 Kubeflow Spark Operator?

适用于 Apache Spark 的 Kubernetes Operator 旨在使指定和运行 Spark 应用程序就像在 Kubernetes 上运行其他工作负载一样简单和符合习惯。它使用 Kubernetes 自定义资源来指定、运行和显示 Spark 应用程序的状态。

简介

在 Spark 2.3 中,Kubernetes 成为了 Spark 的官方调度后端,此外还有 standalone 调度器、Mesos 和 Yarn。与在 Kubernetes 之上部署独立的 Spark 集群并将应用程序提交到独立集群上运行的替代方法相比,将 Kubernetes 作为原生调度后端提供了 SPARK-18278 中讨论的一些重要优势,是一个巨大的进步。然而,Spark 应用程序生命周期的管理方式,例如应用程序如何提交到 Kubernetes 上运行以及应用程序状态如何跟踪,与 Kubernetes 上其他类型的工作负载(例如 Deployments、DaemonSets 和 StatefulSets)的方式差异很大。适用于 Apache Spark 的 Kubernetes Operator 缩小了差距,并允许 Spark 应用程序以符合习惯的方式在 Kubernetes 上指定、运行和监控。

具体来说,适用于 Apache Spark 的 Kubernetes Operator 遵循了利用 operator 模式管理 Kubernetes 集群上 Spark 应用程序生命周期的最新趋势。该 operator 允许以声明式方式(例如在 YAML 文件中)指定 Spark 应用程序并运行,无需处理 Spark 提交过程。它还使得 Spark 应用程序的状态可以像 Kubernetes 上其他类型的工作负载一样被符合习惯地跟踪和呈现。本文档讨论了该 operator 的设计和架构。有关用于 Spark 应用程序规范的 CustomResourceDefinition 的文档,请参阅API 定义

适用于 Apache Spark 的 Kubernetes Operator 目前支持以下功能列表

  • 支持 Spark 2.3 及更高版本。
  • 通过自定义资源实现声明式应用程序规范和管理。
  • 对于每个符合提交条件的 SparkApplication,自动代表用户运行 spark-submit
  • 提供原生 cron 支持,用于运行定时应用程序。
  • 通过变更准入 webhook 支持 Spark pods 的定制,超出 Spark 原生支持的范围,例如挂载 ConfigMaps 和卷,以及设置 pod 亲和性/反亲和性。
  • 支持对规范已更新的 SparkApplication 对象进行自动应用程序重新提交。
  • 支持具有可配置重启策略的自动应用程序重启。
  • 支持失败提交的自动重试,可选线性退避。
  • 支持通过 sparkctl 自动将本地 Hadoop 配置挂载为 Kubernetes ConfigMap。
  • 支持通过 sparkctl 自动将本地应用程序依赖项暂存到 Google Cloud Storage (GCS)。
  • 支持收集应用级别指标以及 driver/executor 指标并将其导出到 Prometheus。

架构

该 operator 包括

  • 一个 SparkApplication 控制器,它监视 SparkApplication 对象的创建、更新和删除事件,并根据监视事件采取行动,
  • 一个负责运行控制器接收到的提交的 提交运行器,它为控制器接收到的提交运行 spark-submit
  • 一个监视 Spark pods 并将 pod 状态更新发送给控制器的 Spark pod 监视器
  • 一个变更准入 Webhook,它根据控制器添加到 pods 上的注解来处理 Spark driver 和 executor pods 的定制,
  • 以及一个名为 sparkctl 的命令行工具,用于与 operator 交互。

下图显示了不同组件如何交互和协同工作。

Spark Operator Architecture Diagram

具体来说,用户使用 sparkctl (或 kubectl) 创建一个 SparkApplication 对象。SparkApplication 控制器通过 API 服务器的监视器接收该对象,创建一个包含 spark-submit 参数的提交,并将提交发送给 提交运行器。提交运行器提交应用程序运行并创建应用程序的 driver pod。启动后,driver pod 会创建 executor pods。当应用程序运行时,Spark pod 监视器 会监视应用程序的 pods,并将 pods 的状态更新发送回控制器,控制器随后会相应地更新应用程序的状态。

CRD 控制器

SparkApplication 控制器,简称 CRD 控制器,监视 Kubernetes 集群中任何命名空间内 SparkApplication 对象的创建、更新和删除事件,并根据监视事件采取行动。当添加新的 SparkApplication 对象时(即调用 ResourceEventHandlerFuncsAddFunc 回调函数时),它将对象入队到一个内部工作队列中,工作进程从中取出对象,准备提交并将其发送给提交运行器,提交运行器实际上负责在 Kubernetes 集群中提交应用程序运行。提交包含 spark-submit 命令的参数列表。提交运行器具有可配置的工作进程数量,用于在集群中提交应用程序运行。当删除 SparkApplication 对象时,该对象将从内部工作队列中出队,并且与该应用程序相关联的所有 Kubernetes 资源都将被删除或垃圾回收。

SparkApplication 对象更新时(即调用 ResourceEventHandlerFuncsUpdateFunc 回调函数时),例如用户使用 kubectl apply 应用更新。控制器会检查 SparkApplicationSpec 中的应用程序规范是否已更改。如果应用程序规范保持不变,控制器会简单地忽略该更新。这确保了没有应用程序规范更改的更新(例如由缓存重新同步触发的更新)不会导致应用程序重新提交。如果更新是针对应用程序规范进行的,控制器会通过删除当前运行的 driver pod 来取消应用程序的当前运行,并使用更新后的规范提交应用程序的新运行。请注意,删除应用程序旧运行的 driver pod 会有效地终止该运行,并导致 executor pods 也被删除,因为 driver 是 executor pods 的所有者。

控制器还负责在 Spark pod 监视器的帮助下更新 SparkApplication 对象的状态,Spark pod 监视器监视 Spark pods 并根据 pods 的状态更新相应的 SparkApplication 对象的 SparkApplicationStatus 字段。Spark pod 监视器监视 Spark pods 的创建、更新和删除事件,根据 pods 的状态创建状态更新消息,并将消息发送给控制器进行处理。当控制器收到状态更新消息时,它会从缓存存储中获取相应的 SparkApplication 对象,并相应地更新 Status 字段。

API 定义中所述,Status 字段(类型为 SparkApplicationStatus)记录了应用程序的整体状态以及每个 executor pod 的状态。请注意,应用程序的整体状态由 driver pod 的状态决定,除非提交失败,在这种情况下不会启动 driver pod。特别是,最终应用程序状态在适用时设置为 driver pod 的终止状态,即如果 driver pod 完成则为 COMPLETED,如果 driver pod 失败则为 FAILED。如果在运行时 driver pod 被删除,最终应用程序状态将设置为 FAILED。如果提交失败,应用程序状态将设置为 FAILED_SUBMISSION。有两种终止状态:COMPLETEDFAILED,这意味着处于这些状态的任何应用程序都不会被 Operator 重试。所有其他状态都是非终止状态,可以根据状态以及 RestartPolicy(如下所述)进行重试。

作为为新创建的 SparkApplication 对象准备提交的一部分,控制器会解析该对象,并添加配置选项以向应用程序的 driver 和 executor pods 添加某些注解。这些注解随后由变更准入 webhook 用于在 pods 开始运行之前配置它们。例如,如果 Spark 应用程序需要将某个 Kubernetes ConfigMap 挂载到 driver 和 executor pods 中,控制器会添加一个指定要挂载的 ConfigMap 名称的注解。随后,变更准入 webhook 会看到 pods 上的注解,并将 ConfigMap 挂载到 pods。

处理应用程序重启和失败

operator 通过 SparkApplicationSpecRestartPolicy 字段(详情请参阅配置自动应用程序重启和故障处理)提供了一个可配置的选项来指定应用程序重启策略。operator 根据应用程序的终止状态和重启策略决定是否应重启应用程序。如上所述,应用程序的终止状态基于 driver pod 的终止状态。因此,该决定实际上基于 driver pod 的终止状态和重启策略。具体来说,以下条件之一适用

  • 如果重启策略类型为 Never,则应用程序终止后不会重启。
  • 如果重启策略类型为 Always,则无论应用程序的终止状态如何,应用程序都会重启。请注意,此类应用程序永远不会进入 COMPLETEDFAILED 的终止状态。
  • 如果重启策略类型为 OnFailure,则仅当应用程序失败且未达到重试限制时,应用程序才会重启。请注意,如上所述,如果 driver pod 在运行时被删除,则应用程序被视为失败。在这种情况下,如果重启策略是 OnFailure,则应用程序会重启。

当 operator 决定重启应用程序时,它会清理与应用程序上一次终止运行相关的 Kubernetes 资源,并将应用程序的 SparkApplication 对象入队到内部工作队列中,工作进程将从中取出该对象来处理提交。请注意,operator 不是重启 driver pod,而是简单地重新提交应用程序,让提交客户端创建一个新的 driver pod。

变更准入 Webhook

operator 附带了一个可选的变更准入 webhook,用于根据 CRD 控制器添加到 pods 上的某些注解来定制 Spark driver 和 executor pods。注解由 operator 根据应用程序规范设置。所有 Spark pod 定制需求(除了 Spark 在 Kubernetes 上原生支持的之外)都由变更准入 webhook 处理。

命令行工具:Sparkctl

sparkctl 是一个用于与 operator 交互的命令行工具。它支持从 YAML 文件创建 SparkApplication 对象、列出现有 SparkApplication 对象、检查 SparkApplication 的状态、将本地端口转发到 Spark driver 运行的远程端口,以及删除 SparkApplication 对象。有关 sparkctl 的更多详细信息,请参阅README

反馈

此页面有帮助吗?


上次修改时间:2025年3月29日:网站:添加深色主题 (#3981) (4f092f1)