spark组件
1、Driver
Spark 驱动器节点,用于执行 Spark 任务中的 main 方法,负责实际代码的执行工作。 Driver 在 Spark 作业执行时主要负责:
- 将用户程序转化为作业(Job);
- 在 Executor 之间调度任务(Task);
- 跟踪 Executor 的执行情况;
- 通过 UI 展示查询运行情况;
2、Executor
Spark Executor 对象是负责在 Spark 作业中运行具体任务,任务彼此之间相互独立。Spark 应用启动时,ExecutorBackend 节点被同时启动,并且始终伴随着整个 Spark 应用的生命周 期而存在。如果有 ExecutorBackend 节点发生了故障或崩溃,Spark 应用也可以继续执行, 会将出错节点上的任务调度到其他 Executor 节点上继续运行。 Executor 有两个核心功能:
- 负责运行组成 Spark 应用的任务,并将结果返回给驱动器(Driver);
- 它们通过自身的块管理器(Block Manager)为用户程序中要求缓存的 RDD 提供内存 式存储。RDD 是直接缓存在 Executor 进程内的,因此任务可以在运行时充分利用缓存 数据加速运算。
3、调度流程
- 任务提交后,都会先启动 Driver 程序;
- 随后 Driver 向集群管理器注册应用程序;
- 之后集群管理器根据此任务的配置文件分配 Executor 并启动;
- Driver 开始执行 main 函数,Spark 查询为懒执行,当执行到 Action 算子时开始反向推 算,根据宽依赖进行 Stage 的划分,随后每一个 Stage 对应一个 Taskset,Taskset 中有多 个 Task,查找可用资源 Executor 进行调度;
- 根据本地化原则,Task 会被分发到指定的 Executor 去执行,在任务执行的过程中, Executor 也会不断与 Driver 进行通信,报告任务运行情况
spark部署
Spark 支持多种集群管理器(Cluster Manager),分别为:
- Standalone:独立模式,Spark 原生的简单集群管理器,自带完整的服务,可单独部署到
一个集群中,无需依赖任何其他资源管理系统,使用 Standalone 可以很方便地搭建一个
集群; - Hadoop YARN:统一的资源管理机制,在上面可以运行多套计算框架,如 MR、Storm
等。根据 Driver 在集群中的位置不同,分为 yarn client(集群外)和 yarn cluster(集群
内部) - Apache Mesos:一个强大的分布式资源管理框架,它允许多种不同的框架部署在其上,
包括 Yarn。 - K8S : 容器式部署环境。
实际上,除了上述这些通用的集群管理器外,Spark 内部也提供了方便用户测试和学习
的本地集群部署模式和 Windows 环境。由于在实际工厂环境下使用的绝大多数的集群管理
器是 Hadoop YARN,因此我们关注的重点是 Hadoop YARN 模式下的 Spark 集群部署。
1、YARN Cluster 模式
- 执行脚本提交任务,实际是启动一个 SparkSubmit 的 JVM 进程;
- SparkSubmit 类中的 main 方法反射调用 YarnClusterApplication 的 main 方法;
- YarnClusterApplication 创建 Yarn 客户端,然后向 Yarn 服务器发送执行指令:bin/java
ApplicationMaster; - Yarn 框架收到指令后会在指定的 NM 中启动 ApplicationMaster;
- ApplicationMaster 启动 Driver 线程,执行用户的作业;
- AM 向 RM 注册,申请资源;
- 获取资源后 AM 向 NM 发送指令:bin/java YarnCoarseGrainedExecutorBackend;
- CoarseGrainedExecutorBackend 进程会接收消息,跟 Driver 通信,注册已经启动的
Executor;然后启动计算对象 Executor 等待接收任务 - Driver 线程继续执行完成作业的调度和任务的执行。
- Driver 分配任务并监控任务的执行。
注意:SparkSubmit、ApplicationMaster 和 CoarseGrainedExecutorBackend 是独立的进程;Driver是独立的线程;Executor 和 YarnClusterApplication 是对象。
2、YARN Client 模式
- 执行脚本提交任务,实际是启动一个 SparkSubmit 的 JVM 进程;
- SparkSubmit 类中的 main 方法反射调用用户代码的 main 方法;
- 启动 Driver 线程,执行用户的作业,并创建 ScheduleBackend;
- YarnClientSchedulerBackend 向 RM 发送指令:bin/java ExecutorLauncher;
- Yarn 框架收到指令后会在指定的 NM 中启动 ExecutorLauncher(实际上还是调用
ApplicationMaster 的 main 方法);
object ExecutorLauncher {
def main(args: Array[String]): Unit = {
ApplicationMaster.main(args)
}}
- AM 向 RM 注册,申请资源;
- 获取资源后 AM 向 NM 发送指令:bin/java CoarseGrainedExecutorBackend;
- CoarseGrainedExecutorBackend 进程会接收消息,跟 Driver 通信,注册已经启动的
Executor;然后启动计算对象 Executor 等待接收任务 - Driver 分配任务并监控任务的执行。
注意:SparkSubmit、ApplicationMaster 和 YarnCoarseGrainedExecutorBackend 是独立的进程;Executor 和 Driver 是对象