集群模式概述

本文档简要概述了 Spark 在集群上运行的方式,以便更容易理解所涉及的组件。阅读应用程序提交指南,了解如何在集群上启动应用程序。

组件

Spark 应用程序作为集群上独立的一组进程运行,由主程序(称为驱动程序)中的 SparkContext 对象协调。

具体来说,要在集群上运行,SparkContext 可以连接到多种类型的集群管理器(可以是 Spark 自己的独立集群管理器、YARN 或 Kubernetes),这些管理器在应用程序之间分配资源。连接后,Spark 会在集群中的节点上获取执行器,这些执行器是运行计算并为应用程序存储数据的进程。接下来,它将应用程序代码(由传递给 SparkContext 的 JAR 或 Python 文件定义)发送给执行器。最后,SparkContext 将任务发送给执行器以运行。

Spark cluster components

关于此架构,有几点值得注意:

  1. 每个应用程序都有自己的执行器进程,这些进程在整个应用程序期间保持运行,并在多个线程中执行任务。这有利于在调度端(每个驱动程序调度自己的任务)和执行器端(来自不同应用程序的任务在不同的 JVM 中运行)隔离应用程序。然而,这也意味着如果不将数据写入外部存储系统,则无法在不同的 Spark 应用程序(SparkContext 实例)之间共享数据。
  2. Spark 不依赖于底层集群管理器。只要它能够获取执行器进程,并且这些进程能够相互通信,即使在也支持其他应用程序(例如 YARN/Kubernetes)的集群管理器上运行 Spark 也相对容易。
  3. 驱动程序在其整个生命周期中必须监听并接受来自其执行器的传入连接(例如,请参阅网络配置部分的 spark.driver.port)。因此,驱动程序必须能够从工作节点进行网络寻址。
  4. 由于驱动程序在集群上调度任务,因此它应该在靠近工作节点的地方运行,最好在同一局域网中。如果想远程向集群发送请求,最好是向驱动程序开放 RPC,让它从附近提交操作,而不是让驱动程序远离工作节点运行。

集群管理器类型

系统目前支持多种集群管理器:

提交应用程序

可以使用 spark-submit 脚本将应用程序提交到任何类型的集群。有关如何操作的详细信息,请参阅应用程序提交指南

监控

每个驱动程序都有一个 Web UI,通常在端口 4040 上,显示有关正在运行的任务、执行器和存储使用情况的信息。只需在 Web 浏览器中访问 http://<driver-node>:4040 即可访问此 UI。监控指南还介绍了其他监控选项。

作业调度

Spark 提供了对资源分配的控制,包括应用程序之间(在集群管理器级别)和应用程序内部(如果同一 SparkContext 上发生多个计算)。作业调度概述对此进行了更详细的描述。

术语表

下表总结了用于指代集群概念的术语:

术语含义
应用程序 基于 Spark 构建的用户程序。由集群上的驱动程序执行器组成。
应用程序 JAR 包 包含用户 Spark 应用程序的 JAR 包。在某些情况下,用户可能希望创建一个包含其应用程序及其依赖项的“胖 JAR 包”。但是,用户的 JAR 包不应包含 Hadoop 或 Spark 库,这些库将在运行时添加。
驱动程序 运行应用程序的 main() 函数并创建 SparkContext 的进程。
集群管理器 用于在集群上获取资源的外部服务(例如:standalone manager、YARN、Kubernetes)。
部署模式 区分驱动程序进程运行的位置。在“cluster”模式下,框架在集群内部启动驱动程序。在“client”模式下,提交者在集群外部启动驱动程序。
工作节点 集群中可以运行应用程序代码的任何节点。
执行器 在工作节点上为应用程序启动的进程,它运行任务并在内存或磁盘存储中保存数据。每个应用程序都有自己的执行器。
任务 将发送到一个执行器的工作单元。
作业 由多个任务组成的并行计算,响应 Spark 操作(例如 save, collect)而生成;你会在驱动程序的日志中看到这个术语。
阶段 每个作业都会被划分为更小的任务集,称为阶段,这些阶段相互依赖(类似于 MapReduce 中的 map 和 reduce 阶段);你会在驱动程序的日志中看到这个术语。