Spark内核系列目录
一、Spark内核的运行机制
二、Spark内核的通讯架构
文章目录
- Spark内核系列目录
- 前言
- 一、Spark核心组件
- 1.Driver
- 2. Executor
- 3. Spark运行流程
- 二、Spark部署方式
- 三、YARN模式运行机制
- 1、YARN Cluster模式
- 2、YARN Client模式
- 总结
前言
Spark内核一般指Spark的核心运行机制,包括核心组件的运行机制、任务调度机制、内存管理机制、核心功能运行原理。
一、Spark核心组件
1.Driver
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. Spark运行流程
spark应用程序核心运行步骤如下:
- 任务提交,启动Driver程序;
- Driver向集群管理器注册应用程序;
- 集群管理器根据任务配置分配Executor并启动;
- Driver执行main函数,执行到Action算子时开始反向推算,根据宽依赖进行划分Stage,每个Stage对应一个Taskset,其中Taskset中有多个Task,查找可用资源Executor进行调度;
- 根据本地化原则,Task会被分发到指定的Executor去执行,在任务执行的过程中,Executor也会不断与Driver进行通信,报告任务运行状况。
二、Spark部署方式
Spark支持多种集群管理器(Cluster Manager),分别为:
1)、Standalone:独立模式,Spark原生的简单集群管理器,自带完整的服务,可单独部署到一个集群中,无需其他资源管理系统。
2)、Hadoop YARN:统一的资源管理机制,可运行多个计算框架。Driver在集群中的位置可分为:yarn client(集群外)与yarn cluster(集群内)。
3)、Apache Mesos:强大的分布式资源管理框架,允许多个不同的框架部署在上面,包括YARN。
4)、K8S:容器化部署环境。
此外,Spark还提供了方便用户测试学习的本地集群部署模式与Windows环境,Hadoop YARN部署方式是企业最常用的。
三、YARN模式运行机制
1、YARN Cluster模式
(1)执行脚本提交任务,即启动SparkSubmit的JVM进程;
(2)SparkSubmit类中的main方法反射调用YarnClusterApplication的main方法;
(3)YarnClusterApplication创建Yarn客户端,想Yarn服务器发送指令:bin/java ApplicationMaster;
(4)Yarn框架在收到指令后会在指定的NM启动ApplicationMaster;
(5)ApplicationMaster启动Driver线程,执行用户的作业;
(6)AM向RM注册,申请资源;
(7)获取资源后AM向NM发送指令:bin/java YarnCoarseGrainedExecutorBackend;
(8)CoarseGrainedExecutorBackend进程会接收信息,和Driver通信,注册已经启动的Executor;然后启动计算对象Executor等待接受任务;
(9)Driver线程继续执行完成作业的调度和任务的执行;
(10)Driver分配任务并监控任务的执行。
注意:SparkSubmit、ApplicationMaster和CoarseGrainedExecutorBackend是独立的进程;Driver是独立的线程;Executor和YarnClusterApplication是对象。
2、YARN Client模式
(1)执行脚本提交任务,实际是启动一个SparkSubmit的JVM进程;
(2)SparkSubmit类中的main方法反射调用用户代码的main方法;
(3)启动Driver线程,执行用户的作业,并创建ScheduleBackend;
(4)YarnScheduleBackend想RM发送指令:bin/java ExecutorLauncher;
(5)Yarn框架收到指令后会指定NM中启动ExecutorLauncher(实际上还是调用ApplicationMaster的main方法);
object ExecutorLauncher {
def main(args: Array[String]): Unit = {
ApplicationMaster.main(args)
}
}
(6)AM向RM注册,申请资源;
(7)获取资源后AM向NM发送指令:bin/java CoarseGrainedExecutorBackend;
(8)CoarseGrainedExecutorBackend进程会接收信息,和Driver通信,注册已经启动的Executor,然后启动计算对象Executor等待接收任务
(9)Driver分配任务并监控任务的执行。
注意:SparkSubmit、ApplicationMaster和CoarseGrainedExecutorBackend是独立的进程;Executor和Driver是对象。
总结
本章主要介绍了Spark的运行机制,分别从组件角度、运行流程角度及Yarn部署模式角度详细介绍了任务调度机制、资源分配方式等。