最近在看《图解Spark:核心原理与技术实践》,为了便于自己温故而知新,已经检验理解是否到位,以下是记录的学习笔记。
我的一般学习思路是首先学会用,再来深入学习。所以,首先由Spark的运行流程切入:
一、运行流程
从Spark的运行流程入手,学习了解Spark的核心组成。下面是Spark的一个基本运行流程
整个过程包括:提交作业、划分调度阶段(78)、提交调度阶段(9)、提交执行任务(1012)、获取执行结果(13)
- 构建Spark application运行环境
a.Spark Application是用户编写的Spark应用程序 - SparkContext向资源管理器(Cluster Manager)注册
a. SparkContext是由Driver运行上述Application中main()函数创建的,其中SparkContext的作用有
b. 资源管理器(Cluster Manager):指在集群上获取资源的外部服务,目前有:
- SparkContext向资源管理器申请运行Executor
- 资源管理器分配Executor
- 资源管理器启动Executor
- Executor发送心跳到资源管理器
a. Executor是Application运行在Worker节点的一个进程,负责运行Task,并负责将数据存在内存或磁盘上。每个Application都有各自独立的一批Executor
b. Worker计算节点,集群中任务可以运行Application代码的节点
2-6步骤如下图所示:
DAGScheduler调度阶段
7. SparkContext构建成DAG图
a. DAG(有向无环图),反应RDD之间的依赖关系,如下图所示:
8. DAGScheduler将DAG图分解成Stage(TaskSet)
9. DAGScheduler将将Stage(TaskSet)发送给TaskScheduler
a. 基于DAG划分Stage,负责将作业拆分成不容阶段的具有依赖关系的多批任务。一个SparkContext对应创建一个DAGScheduler(有向无环图调度器)
b. Stage的划分依据就是宽依赖
c. DAGScheduler的作用有:
TaskScheduler调度阶段
- Executor向SparkContext申请Task
- TaskScheduler将Task发放给Executor运行
- 同时,SparkContext将应用程序代码发放给Executor
- Task在Executor上运行,运行完毕释放所有资源
a. TaskScheduler任务调度器,将Taskset提交给Worker执行并监控,完成的任务有:
二、任务调度总体诠释
Spark 中出现的几个概念的关系:
- Job、Stage、TaskSet、Task
作业Job:RDD中由action操作生成的一个或多个调度阶段
调度阶段Stage:每个Job会因为RDD之间的依赖关系拆分多组任务集合(称为调度阶段, 也叫作TaskSet任务集)调度阶段由DAGScheduler来划分,调度阶段有Shuffle Map Stage和Result Stage
任务Task:Spark实际执行应用的最小单元,分发到Executor上的工作任务