Spark学习之 Spark调度机制(1)

639 阅读4分钟

(推广一下自己的个人主页zicesun.com

Spark的调度机制是Spark的核心基础,分成两个部分,一是集群资源调度,二是应用程序内部的作业调度。这篇文章简单介绍一下基本概念。

基本概念

  1. 应用程序(Application) 每次通过spark-submit命令提交的Jar包都可以看作是Spark应用程序。Spark应用程序是集群管理器调度的基本单位,一个应用程序对应着一个驱动程序。

  2. 驱动程序(Driver Program) 包含在main函数并且在函数内部实例化SparkContext对象的应用程序叫做驱动程序。Driver程序所运行的机器叫做客户端(Clien),而客户端可以使Master节点,也可以是Worker节点,也有可能两个都不是。Spark中作业调度的相关工作,包括作业任务划分为阶段,阶段在进一步分割成多个任务等等都是在Driver程序中执行的。作业调度完毕之后,Driver程序会把实际的并行计算任务交付给Executor去执行。

  3. Master运行Master守护进程的集群节点,管理这整个集群。一个集群中Master节点可以有多个,但是一次只有一个活跃状态的Master,其余的都是备用节点。 Master节点有两个用途:一是应用程序调度,Master接收用户提交的应用程序,并将应用程序交付执行,当有多个程序调试,会对这些应用程序执行的先后顺序进行调度;而是资源调度,由于集群中的资源实际上指的是Worker节点上的计算和内存资源,因此Master节点实际上是对Worker节点进行调度,注册和管理集群中所有的Worker节点。

  4. Worker运行Worker守护线程的集群节点,是集群资源的贡献节点。一个Worker上有多个Executor。一个集群一般有多个Worker,统一受Master管理。每一个Worker节点再启动之后都会向master节点注册自己,向master汇报自己的核心总数和内存总量,并按照master节点的指示启动内部的Executor。并且worker节点会向Master发送心跳,让Master知道Worker是否宕机或者发生延迟。

  5. 任务执行器(Executor)实际执行任务的单元,拥有计算和内存资源。每一个Executor维持一个线程池,线程池中的每一个线程用于执行一个任务。每个Executor内部执行的任务属于同一个应用程序。

  6. 作业(Job):前面也讲过,RDD计算具有惰性,只有遇到动作操作或者需要把RDD持久化的时候,计算才真正开始。Spark中将动作操作或者持久化操作作为Job的标识。一个Spark应用程序包含多个作业,由于这些作业之间相互独立,因此不需要对其进行调度,Spark的作业调度仅考虑一个作业内部的调度过程。

  7. 阶段(Stage): Spark讲依赖分为窄依赖和shuffle依赖,而shuffle依赖意味着分区之间的数据需要shuffle,因此Spark讲shuffle作为划分stage的标识。

  8. 任务集(Taskset):每一个阶段可能包含多个可并发执行的任务,这里把同一个阶段内部的所有任务汇总在一起,成为一个任务集。任务集是DAG调度器交付给任务调度器的基本单位。

通信框架

Spark内部模块之间的通信采用了基于 Actor模型的消息传递机制,实际上使用了Actor模型的Scala语言实现的Akka库。Actor模型有Actor和Ref两类对象,分别有函数actorOf和actorFor创建。

通俗地讲,Actor对象相当与Web服务中的服务器端,用于接收来自客户端的请求,并根据请求消息的类型执行不同操作,返回结果。Ref对象可以类比为web服务中的客户端,用于向服务器端发送请求并接收处理结果。