Spark源码剖析(四):Master原理与源码剖析(上)

一. 主备切换机制

概要

Spark Master主备切换能够基于两种机制,一种是基于文件系统的,一种是基于Zookeeper的,基于文件系统的主备切换机制,须要在Active Master挂掉以后,由咱们手动去切换到Standby Master上;而基于Zookeeper的主备切换机制,能够实现自动切换Master。算法

因此咱们接下来重点说说在主Master挂掉后,Standby Master都会作哪些操做。 
缓存

Standby Master切换步骤

@Standby Master切换流程图

Standby Master切换流程图数据结构

  1. Standby Master首先使用持久化引擎(FileSystemPersistenceEngine或者ZookeeperPersistenceEngine)去读取持久化的storedApps、storeDrivers、storedWorkers。 
  2. 判断若是storedApps、storeDrivers、storedWorkers有任何一个是非空的话,就将持久化的Applications、Drivers、Workers信息从新进行注册,注册到Standby Master内存缓存结构中。 
  3. 将Applications、Workers的状态都修改成UNKNOWN。而后向Application所对应的Driver以及Worker发送Standby Master的地址。 
  4. Driver和Worker若是都是正常在运做的话,那么收到Standby Master发送来的地址后,就会更新Master地址,并返回响应给新的Master。 
  5. 此时Standby Master在陆续接收到Driver和Worker的响应信息后,会调用competeRecovery方法对没有发送响应消息的Driver和Worker进行处理,过滤掉他们的信息。

competeRecovery方法app

Alt text 
  
removeWorker方法源码分析

Alt text

  1. 调用schedule方法,对正在等待资源调度的Driver和Application进行调度。好比在某个worker上启动Driver,或是为Application在某个Worker上启动它须要的Executor等。

二. 注册机制

@Master注册机制流程图

Master注册机制流程图spa

 
  
因为上面三种注册方式的原理和源码有不少类似之处,因此这里仅对Application的注册进行详解,其余将再也不过多累述。 

1. Application注册

注册时机

Driver启动后,执行咱们编写的Application代码,执行SparkContext初始化,底层的SparkDeployScheduleBackend会经过AppClient内部的线程ClientActor发送RegisterApplication到Master,进行Application的注册线程

注册流程及源码分析

Alt text

  1. Master接收到Application的注册信息后,用ApplicationDescription信息建立ApplicationInfo对象,将其信息放入到内存缓存app中(HashSet)。

Alt text 
  
Spark中各个内存缓存的数据结构:code

Alt text 

  1. 将Application加入等待调度的Application队列waitingApps(ArrayBuffer)。

Alt text 

  1. 用持久化引擎将Application信息持久化(详见RegisterApplication方法中第三步)。 
  2. 调用schedule()方法进行资源管理(详见RegisterApplication方法中第五步)。

2. Worker注册

注册时机

Worker节点在启动后,就会主动向Master进行注册对象

注册流程分析

  1. Master接收到Worker节点的注册信息后,将状态为DEAD的Worker过滤掉,对于状态为UNKNOWN的Worker,更新其信息;将Worker加入到内存缓存worker中(HashSet)。 
  2. 用持久化引擎将worker信息持久化。 
  3. 调用schedule()方法进行资源管理。

3. Driver注册

注册时机

spark-submit提交spark Application时,首先就会注册Driver。队列

注册流程及源码分析

  1. Master接收到Driver的注册信息后,将其信息放入到内存缓存driver中(HashSet)。 
  2. 将Application加入等待调度的Application队列waitingDrivers(ArrayBuffer)。 
  3. 用持久化引擎将Application信息持久化。 
  4. 调用schedule()方法进行资源管理。

 到这里关于Spark Master的核心源码已经剖析了一小半了,有了这一讲的基础,咱们下一讲就能够剖析Master最最重要的资源调度算法了!

相关文章
相关标签/搜索