Spark 内核泛指 Spark 的核心运行机制
包括 Spark 核心组件的运行机制、Spark 任务调度机制、Spark 内存管理机制、Spark 核心功能的运行原理等
熟练掌握 Spark 内核原理,能够帮助我们更好地完成 Spark 代码设计,并能够帮助我们准确锁定项目运行过程中出现的问题的症结所在。
一. Spark 核心组件
- 1.
Cluster Manager(Master, ResourceManager)
Spark 的集群管理器, 主要负责对整个集群资源的分配与管理.
Cluster Manager 在 Yarn 部署模式下为 ResourceManager; 在 Mesos 部署模式下为 Mesos Master; 在 Standalone 部署模式下为 Master.
Cluster Manager 分配的资源属于一级分配, 它将各个 Worker 上的内存, CPU 等资源分配给 Application, 但并不负责对 Executor 的资源的分配.
- 2.
Worker(Worker, NodeManager)
Spark 的工作节点.
在 Yarn 部署模式下实际由 NodeManager 替代.
主要负责以下工作
- 将自己的内存, CPU 等资源通过注册机制告知
Cluster Manager -
创建 Executor进程 - 将资源和任务进一步分配给
Executor - 同步资源信息,
Executor状态信息给ClusterManager等. - 3.
Driver
Spark 驱动器节点,用于执行 Spark 任务中的 main 方法,负责实际代码的执行工作。
Driver 在 Spark 作业执行时主要负责:
- 将用户程序转化为作业(Job);
- 在 Executor 之间调度任务(Task);
- 跟踪 Executor 的执行情况;
- 通过 UI 展示查询运行情况;
- 4.
Executor
Spark Executor 节点是负责在 Spark 作业中运行具体任务,任务彼此之间相互独立。
Spark 应用启动时,Executor 节点被同时启动,并且始终伴随着整个 Spark 应用的生命周期而存在。
如果有 Executor 节点发生了故障或崩溃,Spark 应用也可以继续执行,会将出错节点上的任务调度到其他 Executor 节点上继续运行。
Executor 有两个核心功能:
- 负责运行组成 Spark 应用的任务,并将结果返回给驱动器(
Driver); - 它们通过自身的块管理器(
Block Manager)为用户程序中要求缓存的 RDD 提供内存式存储。RDD 的数据是直接缓存在Executor进程内的,因此任务可以在运行时充分利用缓存数据加速运算。
- 5.
Application
用户使用 Spark 提供的 API 编写的应用程序.
Application通过 Spark API 将进行 RDD 的转换和 DAG 的构建, 并通过Driver将Application注册到Cluster Manager.Cluster Manager将会根据Application的资源需求, 通过一级分配将 Executor, 内存, CPU 等资源分配给Application.Driver通过二级分配将Executor等资源分配给每一个任务,Application最后通过Driver告诉Executor运行任务
二. Spark 通用运行流程

上图为 Spark 通用运行流程,不论 Spark 以何种模式进行部署,都是以如下核心步骤进行工作的:
- 任务提交后,都会先启动 Driver 程序;
- 随后 Driver 向集群管理器注册应用程序;
- 之后集群管理器根据此任务的配置文件分配 Executor 并启动该应用程序;
- 当 Driver 所需的资源全部满足后,Driver 开始执行 main 函数,Spark 转换为懒执行,当执行到 Action 算子时开始反向推算,根据宽依赖进行 Stage 的划分,随后每一个 Stage 对应一个 Taskset,Taskset 中有多个Task;
- 根据本地化原则,Task 会被分发到指定的 Executor 去执行,在任务执行的过程中,Executor 也会不断与 Driver 进行通信,报告任务运行情况。
本次的分享就到这里了


