Spark 的集群架构是其分布式计算能力的核心,主要由 Driver Program、Executors 和一个 Cluster Manager 协同工作。以下是各组件及其交互的详细说明:
1. Driver Program (驱动程序)
- 角色: 应用的主控进程,相当于“大脑”。
- 位置: 通常在集群外的一个客户端机器上启动(
client
模式),也可以在集群内的某个节点上启动(cluster
模式)。 - 核心职责:
- 解析应用代码: 将用户编写的 Spark 应用代码(包含
SparkContext
初始化)转换成逻辑执行计划(有向无环图 DAG)。 - 优化与调度: 将逻辑计划优化并转换为物理执行计划(一系列任务 Stages 和 Tasks)。
- 任务分发: 向 Cluster Manager 申请资源,并将 Task 分发给 Executors 执行。
- 协调与监控: 跟踪所有 Executor 的状态、任务的执行进度、处理故障恢复(失败任务重试)。
- 结果收集: 收集 Executors 返回的计算结果(如
collect()
、count()
等 Action 操作的结果)或写入外部存储。 - 持有
SparkContext
: 是 Spark 功能的入口点,代表与 Spark 集群的连接。
- 解析应用代码: 将用户编写的 Spark 应用代码(包含
2. Executors (执行器)
- 角色: 在集群的工作节点上运行的进程,相当于“工人”。
- 位置: 每个 Worker Node 上可以运行一个或多个 Executor 进程。
- 核心职责:
- 执行任务: 接收 Driver 分配的 Task(数据处理的最小单位),并在其线程池中执行这些 Task。
- 数据存储: 负责存储分配给它的数据分区(RDD partitions)。提供内存(或磁盘)缓存(通过 Block Manager)供 Task 高效读写。这是 Spark 高效迭代计算的关键。
- 心跳汇报: 定期向 Driver 发送心跳信号,报告自身状态和 Task 执行进度。
- Shuffle 数据服务: 在需要 Shuffle 的操作(如
groupByKey
,reduceByKey
,join
)中,Executor 负责将 Map 阶段产生的中间数据写入本地存储(Shuffle 文件),供 Reduce 阶段的 Task 拉取。
3. Cluster Manager (集群管理器)
- 角色: Spark 集群的资源管理和调度系统,相当于“资源管家”。Spark 本身不管理资源,而是依赖外部的集群管理器。
- 核心职责:
- 资源抽象: 将集群的物理资源(CPU、内存)抽象化。
- 资源分配: 根据 Driver 的请求,为 Spark 应用分配 Executor 进程所需的资源(CPU 核心数、内存大小)。
- 节点管理: 管理集群中的工作节点(Worker Nodes),监控其状态。
- 启动 Executors: 在分配了资源的 Worker Node 上启动 Executor 进程。
- 可选组件: Spark 支持多种集群管理器。
主要的 Cluster Manager 类型
-
Spark Standalone:
- Spark 内置的简单集群管理器。
- 包含 Master (资源管理) 和 Worker (节点管理) 守护进程。
- 部署简单,无需其他框架。
- 功能相对基础,适合轻量级或测试环境。
-
Apache Hadoop YARN:
- Hadoop 2.x 及更高版本的默认资源管理器。
- Driver 和 Executor 作为 YARN 的 Application Master 和 Containers 运行。
- 充分利用 Hadoop 生态资源,共享集群资源(与 MapReduce、Hive 等应用共存)。
- 在生产环境中非常流行,尤其是在已有 Hadoop 集群的场景。
-
Kubernetes:
- 领先的容器编排系统。
- Driver 和每个 Executor 都运行在独立的 Pod 中。
- 提供强大的容器化、声明式配置、自动扩缩容、高可用性、多租户支持。
- 云原生部署的首选,发展迅速,是 Spark 社区的重点方向。
-
Apache Mesos:
- 通用的集群资源管理器,曾广泛用于数据中心。
- Spark 可以作为 Mesos Framework 运行。
- 支持细粒度或粗粒度资源调度。
- 目前在生产环境中的使用率已显著下降,逐渐被 YARN 和 Kubernetes 取代。
核心交互流程 (资源申请与任务执行)
- 应用启动: 用户提交 Spark 应用 (
spark-submit
),启动 Driver 进程。 - 初始化 & 资源申请:
- Driver 进程内的
SparkContext
初始化。 SparkContext
连接到指定的 Cluster Manager。SparkContext
向 Cluster Manager 申请 Executor 资源(指定需要的 Executor 数量、每个 Executor 需要的 CPU 和内存)。
- Driver 进程内的
- 资源分配 & Executor 启动:
- Cluster Manager 在它管理的 Worker Nodes 上找到满足要求的资源。
- Cluster Manager 在这些 Worker Nodes 上启动 Executor 进程。
- 启动后,Executor 主动反向注册到 Driver 的
SparkContext
。
- 任务分发与执行:
- Driver 将用户代码转换成 Task (基于 RDD 的 DAG 划分出的 Stage)。
- Driver 根据数据本地性(数据在哪里)将 Task 调度到拥有相应数据分区的 Executor 上执行。
- Executor 接收 Task,在其线程池中执行,并将结果或状态返回给 Driver。
- 监控与容错:
- Driver 监控所有 Executor 和 Task 的状态。
- 如果 Task 失败(Executor 丢失、Task 执行超时等),Driver 会重新调度该 Task 到其他 Executor 执行。
- Executor 定期向 Driver 发送心跳;Driver 长时间未收到心跳会认为该 Executor 失效,并在其他节点上重新申请资源启动 Executor,并重新运行该 Executor 上丢失的 Task。
- 结果返回 & 应用结束:
- Action 操作的结果最终返回给 Driver 程序(或写入外部存储)。
- 当
SparkContext.stop()
被调用或应用正常结束时:- Driver 通知 Cluster Manager 释放所有为该应用分配的 Executor 资源。
- Cluster Manager 关闭 Executor 进程。
总结图示:
+--------------------------------------------------------------------------------------------------+
| Spark Application (Driver) |
| +-----------------+ +-----------------------------------------------------------------------+ |
| | User Code | --> | SparkContext (Master of the App) | |
| | (e.g., main()) | | - Converts code to DAG/Stages/Tasks | |
| | | | - Requests resources from Cluster Manager | |
| +-----------------+ | - Schedules Tasks to Executors | |
| | - Monitors progress, handles failures | |
| | - Collects results | |
| +-----------------------------------------------------------------------+ |
+------------------------------------------^--------------------------------------------------------+
| (1. Request Resources / 2. Task Scheduling / 5. Results)
|
v
+--------------------------------------------------------------------------------------------------+
| Cluster Manager (Resource Layer) |
| +----------------------+ |
| | Standalone Master | |
| | OR | <---- (1. Resource Requests) ----> +-----------------+ |
| | YARN ResourceManager | | Worker Nodes | |
| | OR | ----> (3. Launch Executors) ------> | (Managed by CM) | |
| | Kubernetes Master | +-----------------+ |
| | OR | |
| | Mesos Master | |
| +----------------------+ |
+--------------------------------------------------------------------------------------------------+
|
| (3. Launch Executors)
v
+-------------------------------------------------+ +-------------------------------------------------+
| Executor 1 (Worker Node 1) | | Executor 2 (Worker Node 2) |
| +-----------------+ +---------------------+ | | +-----------------+ +---------------------+ |
| | Task | | | | | | Task | | | |
| | Task | | Block Manager | | | | Task | | Block Manager | |
| | ... | | (Memory/Disk Cache) | | | | ... | | (Memory/Disk Cache) | |
| | (Thread Pool) | | | | | | (Thread Pool) | | | |
| +-----------------+ +---------------------+ | | +-----------------+ +---------------------+ |
| +---------------------------------------------+ | | +---------------------------------------------+ |
| | JVM Process (Resources: Cores/Mem) | | | | JVM Process (Resources: Cores/Mem) | |
| +---------------------------------------------+ | | +---------------------------------------------+ |
+-------------------------------------------------+ +-------------------------------------------------+
^ ^
| (4. Run Task / 5. Status/Result) |
| |
+--------------------------------------------------+
(2. Task Scheduling from Driver)
理解 Driver、Executor 和 Cluster Manager 的角色及其交互,是掌握 Spark 分布式运行原理和进行性能调优、故障排查的基础。不同的 Cluster Manager 选择会影响部署方式、资源隔离性、弹性和运维复杂度。