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方法

Alt text 
  
removeWorker方法

Alt text

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

二. 注册机制

@Master注册机制流程图

Master注册机制流程图

 
  
由于上面三种注册方式的原理和源码有很多相似之处,所以这里仅对Application的注册进行详解,其他将不再过多累述。 

1. Application注册

注册时机

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

注册流程及源码分析

Alt text

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

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

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最最重要的资源调度算法了!


posted @ 2018-01-01 20:08  小丑进场  阅读(443)  评论(0编辑  收藏  举报