spark任务调度

 Application

application(应用)其实就是spark-submit提交的spark应用程序。一个完整的Spark应用程序包含如下几个基本步骤:

  1. 获取输入数据(通过序列获取,读取HDFS,读取数据库,读去S3等!)
  2. 处理数据(具体的代码逻辑)
  3. 输出结果(导入到HDFS,Hbase,MySQL等存储)

从spark官网的这幅图可以简单看出,提交一个spark应用程序会创建一个driver端来管理这个spark应用程序。和YARN的ApplicationMaster相似,完成任务的调度以及与executor和ClusterManager协调。有两种模式,client以及cluster模式。client模式将driver运行在spark-submit执行的机器中,cluster则是在spark集群中随机挑选一台执行。如果spark调度器集成了YARN,那么这两种模式在YARN中也有类似的体现!

Spark Application 的执行框架如图所示。 一个 Spark Application 由两
部分构成: Driver Program 和若干 Executor。 其中 Driver Program 中包含了 Spark Context 和 main 函
数; Executor 是 Worker 中用于运行 Task 的进程。 在执行 Spark Application 过程中,集群上的资源如
何调度,由 Cluster Manager 进行管理。

 

Driver Program

Spark Driver Program(以下简称Driver)是运行Application的main函数并且新建SparkContext实例的程序。其实,初始化SparkContext是为了准备Spark应用程序的运行环境,在Spark中,由SparkContext负责与集群进行通信、资源的申请、任务的分配和监控等。当Worker节点中的Executor运行完毕Task后,Driver同时负责将SparkContext关闭。通常也可以使用SparkContext来代表驱动程序(Driver)。

Driver(SparkContext)整体架构图如下所示:

 

SparkContext

SparkContext是通往Spark集群的唯一入口,可以用来在Spark集群中创建RDDs、累加器(Accumulators)和广播变量(Broadcast Variables)。SparkContext也是整个Spark应用程序(Application)中至关重要的一个对象,可以说是整个Application运行调度的核心(不是指资源调度)。

  SparkContext的核心作用是初始化Spark应用程序运行所需要的核心组件,包括高层调度器(DAGScheduler)、底层调度器(TaskScheduler)和调度器的通信终端(SchedulerBackend),同时还会负责Spark程序向Master注册程序等。

 

Worker

Worker Node: 集群中任何可以运行Application代码的节点,在Standalone模式中指的是通过slaves文件配置的Worker节点,在Spark on Yarn模式下就是NodeManager节点
  • 主要功能:管理当前节点内存,CPU的使用状况,接收master分配过来的资源指令,通过ExecutorRunner启动程序分配任务,worker就类似于包工头,管理分配新进程,做计算的服务,相当于process服务。
  • 需要注意的是:
    • 1)worker不会汇报当前信息给master,worker心跳给master主要只有workid,它不会发送资源信息以心跳的方式给mater,master分配的时候就知道worker,只有出现故障的时候才会发送资源。
    • 2)worker不会运行代码,具体运行的是Executor是可以运行具体appliaction写的业务逻辑代码,操作代码的节点,它不会运行程序的代码的。

Executor

是 Worker 上为某个 Application 启动的一个进程,该进程负责执行任务并且负责将数据存储在内存或者磁盘中 。 Executor 拥有 CPU 和内存资源,它是资源管理系统能够给予的最小单位。一个 Worker 节点上可能有多个 Executor,但是每个 Executor 中仅执行一个 Application 对应的任务。 也就是说 ,不同的 Application 通过 Executor 无法共享数据。

 

Task

Task 即任务,是被送到 Executor 上执行的工作单元 。 RDD 中的每个分区都对应相应的 Task ,而每个 Task 对应于 Executor 中的一个线程,这使得系统更加轻量级, Task 之间切换的时间延迟更短。

 

Job

Job 即作业,是包含多个 Task 的并行计算,其与 Application 中的执行操作一一对应,也就是说
Application 每提交一个执行操作 Spark 对应生成一个 Job 。

 

Stage

通常执行操作之前会有若干个转换操作,而每个转换操作意味着父 RDD 到子 RDD 的转换,因
此一个 Job 中通常涉及多个 RDD。 将 Job 中涉及的 RDD 进行分组,每组称为一个 Stage。

 

Cluster Manager

是在集群上获取资源的外部服务。若是 Standalone 模式的 Spark 集群, Cluster Manager 即为 Master;
若是基于 Yam 模式的 Spark 集群, Cluster Manager 即为 Resource Manager。

 

Job、Stage、Task 划分方法

Job 是以 Action 方法为界,遇到一个 Action 方法则触发一个 Job;
Stage 是 Job 的子集,以 RDD 宽依赖(即 Shuffle)为界,遇到 Shuffle 做一次划分;
Task 是 Stage 的子集,以并行度(分区数)来衡量,分区数是多少,则有多少个 task。

 

Spark 任务提交流程

 

提交一个 Spark 应用程序,首先通过 Client 向 ResourceManager 请求启动一个
Application,同时检查是否有足够的资源满足 Application 的需求,如果资源条件满
足,则准备 ApplicationMaster 的启动上下文,交给 ResourceManager,并循环监控
Application 状态。
 
  当提交的资源队列中有资源时,ResourceManager 会在某个 NodeManager 上启
动 ApplicationMaster 进程,ApplicationMaster 会单独启动 Driver 后台线程,当 Driver
启动后,ApplicationMaster 会通过本地的 RPC 连接 Driver,并开始向 ResourceManager
申请 Container 资源运行 Executor 进程(一个 Executor 对应与一个 Container),当
ResourceManager 返回 Container 资源,ApplicationMaster 则在对应的 Container 上启
动 Executor。
 
  Driver 线程主要是初始化 SparkContext 对象,准备运行所需的上下文,然后一
方面保持与 ApplicationMaster 的 RPC 连接,通过 ApplicationMaster 申请资源,另一
方面根据用户业务逻辑开始调度任务,将任务下发到已有的空闲 Executor 上。
 
  当 ResourceManager 向 ApplicationMaster 返 回 Container 资源时,
ApplicationMaster 就尝试在对应的 Container 上启动 Executor 进程,Executor 进程起
来后,会向 Driver 反向注册,注册成功后保持与 Driver 的心跳,同时等待 Driver
分发任务,当分发的任务执行完毕后,将任务状态上报给 Driver。
 
  从上述时序图可知,Client 只负责提交 Application 并监控 Application 的状态。
对于 Spark 的任务调度主要是集中在两个方面: 资源申请和任务分发,其主要是通
过 ApplicationMaster、Driver 以及 Executor 之间来完成。
 
 

Spark 任务调度概述

当 Driver 起来后,Driver 则会根据用户程序逻辑准备任务,并根据 Executor 资源情况逐步分发任务。Spark 的任务调度总体来说分两路进行,一路是 Stage 级的调度,一路是 Task级的调度,总体调度流程如下图所示: 

 

参考资料

https://blog.csdn.net/addUpDay/article/details/89112712

https://www.cnblogs.com/xiaoyh/p/13696500.html

https://www.cnblogs.com/libin2015/p/12795157.html

posted @ 2021-09-14 20:31  xd_xumaomao  阅读(217)  评论(0编辑  收藏  举报