Spark运行原理
-
Application:Spark应用程序
-
指用户编写的Spark应用程序,包含了Driver功能代码和分布在集群中多个节点运行的Executor代码
-
Spark应用程序,由一个或多个作业JOB组成
-
-
Driver:驱动程序
- Spark中的Driver即运行application的main()函数并创建SparkContext,其中创建SparkContext的目的是为了准备Spark应用程序的运行环境.在Spark中由SparkContext负责和ClusterManager通信,进行资源的申请,任务的分配和监控等;当Executor部分运行完毕后,Driver负责将SparkContext关闭.
-
Cluster Manager:资源管理器
- 指的是在集群上获取资源的外部服务,常用的有:Standalone,Spark原生的资源管理器,由Master负责资源的分配;Hadoop Yarn,由Yarn中的ResearchManager负责资源的分配;Messos,由Messos中的Messos Master负责资源管理
-
Executor:执行器
- Application运行在Worker节点上的一个进程,该进程负责运行Task,并且负责将数据存在内存或者磁盘上,每个Application都有各自独立的一批Executor
-
Worker:计算节点
- 集群中任何可以运行Application代码的节点,类似于Yarn中的NodeManager节点.在Standalone模式中指的就是通过Slave文件配置的Worker节点,在Spark on Yarn 模式中指的就是NodeManager节点,在Spark on Messos 模式指的就是Messos Slave节点
-
RDD:弹性分布式数据集
- Resillient Distributed Dataset,Spark的基本计算单元,可以通过一系列算子进行操作
-
窄依赖
- 父RDD每一个分区最多被一个子RDD的分区所用;表现为一个父RDD的分区对应一个子RDD的分区,或两个父RDD的分区对应一个子RDD的分区
- 父RDD每一个分区最多被一个子RDD的分区所用;表现为一个父RDD的分区对应一个子RDD的分区,或两个父RDD的分区对应一个子RDD的分区
-
宽依赖
- 父RDD的每个分区都可能被多个子RDD分区所使用,子RDD分区通常对应所有的父RDD分区
- 父RDD的每个分区都可能被多个子RDD分区所使用,子RDD分区通常对应所有的父RDD分区
-
DAG:有向无环图
-
Directed Acycle graph,反应RDD之间的依赖关系
-
-
DAGScheduler:有向无环图调度器
- 基于DAG划分Stage并以TaskSet的形式提交stage给TaskScheduler;负责将作业拆分成不同阶段的具有依赖关系的多批任务;最重要的任务之一就是:计算作业和任务的依赖关系,指定调度逻辑.在SparkContext初始化的过程中被实例化,一个SparkContext对应创建一个DAGScheduler
-
TaskScheduler
- 将Taskset提交给worker运行并汇报结果;负责每个具体任务的实际物理调度.
-
Job:作业
- 由一个或者多个调度阶段所组成的一次计算作业;包含多个Task成的并行计算,往往由Spark Action催生,一个job包含多个RDD及作用于RDD上的各种Operation
-
Stage:调度阶段
- 一个任务集对应的调度阶段;每个job会被拆分为很多组Task,每组Task被称为Stage,也可称TaskSet,一个作业Fenwick多个阶段;Stage分成两种类型ShuffleMapStage,ResultStage
-
TaskSet:任务集
-
由一组关联的,但是相互之间没有shuffle依赖关系的任务所组成的任务集
- 一个stage创建一个TaskSet
- 为Stage的每个RDD分区创建一个Task,多个Task封装成TaskSet
-
-
Task:任务
- 被送到某个Executor上的工作任务;单个分区数据集上的最小处理流程单元
-
总体如下图所示
- Spark运行基本流程
- 构建Spark Application运行环境
- SparkContext向资源管理器注册
- SparkContext向资源管理器申请运行Executor
- 资源管理器分配Executor
- 资源管理器启动Executor
- Executor发送心跳至资源管理器
- SparkContext构成DAG图
- 将DAG图分解成Stage
- 将Stage发送给TaskScheduler
- Executor向SparkContext申请Task
- TaskScheduler向Task发给Executor运行
- Executor运行
- 同时SparkContext将应用程序代码发送给Executor
- Task在Executor上运行,运行完毕释放所有资源