最近在看《图解Spark:核心原理与技术实践》,为了便于自己温故而知新,已经检验理解是否到位,以下是记录的学习笔记。

我的一般学习思路是首先学会用,再来深入学习。所以,首先由Spark的运行流程切入:

一、运行流程

从Spark的运行流程入手,学习了解Spark的核心组成。下面是Spark的一个基本运行流程

spark 状态 spark运行过程_资源管理器


整个过程包括:提交作业、划分调度阶段(78)、提交调度阶段(9)、提交执行任务(1012)、获取执行结果(13)

  1. 构建Spark application运行环境
    a.Spark Application是用户编写的Spark应用程序
  2. SparkContext向资源管理器(Cluster Manager)注册
    a. SparkContext是由Driver运行上述Application中main()函数创建的,其中SparkContext的作用有

    b. 资源管理器(Cluster Manager):指在集群上获取资源的外部服务,目前有:
  3. SparkContext向资源管理器申请运行Executor
  4. 资源管理器分配Executor
  5. 资源管理器启动Executor
  6. Executor发送心跳到资源管理器
    a. Executor是Application运行在Worker节点的一个进程,负责运行Task,并负责将数据存在内存或磁盘上。每个Application都有各自独立的一批Executor
    b. Worker计算节点,集群中任务可以运行Application代码的节点

2-6步骤如下图所示:

spark 状态 spark运行过程_Spark_02


DAGScheduler调度阶段

7. SparkContext构建成DAG图

a. DAG(有向无环图),反应RDD之间的依赖关系,如下图所示:

spark 状态 spark运行过程_应用程序_03


8. DAGScheduler将DAG图分解成Stage(TaskSet)

9. DAGScheduler将将Stage(TaskSet)发送给TaskScheduler

a. 基于DAG划分Stage,负责将作业拆分成不容阶段的具有依赖关系的多批任务。一个SparkContext对应创建一个DAGScheduler(有向无环图调度器)

b. Stage的划分依据就是宽依赖

c. DAGScheduler的作用有:

spark 状态 spark运行过程_依赖关系_04


TaskScheduler调度阶段

  1. Executor向SparkContext申请Task
  2. TaskScheduler将Task发放给Executor运行
  3. 同时,SparkContext将应用程序代码发放给Executor
  4. Task在Executor上运行,运行完毕释放所有资源
    a. TaskScheduler任务调度器,将Taskset提交给Worker执行并监控,完成的任务有:

二、任务调度总体诠释

spark 状态 spark运行过程_资源管理器_05


Spark 中出现的几个概念的关系:

  1. Job、Stage、TaskSet、Task

    作业Job:RDD中由action操作生成的一个或多个调度阶段
    调度阶段Stage:每个Job会因为RDD之间的依赖关系拆分多组任务集合(称为调度阶段, 也叫作TaskSet任务集)调度阶段由DAGScheduler来划分,调度阶段有Shuffle Map Stage和Result Stage
    任务Task:Spark实际执行应用的最小单元,分发到Executor上的工作任务