Spark源码剖析(四):Master原理与源码剖析(上)
一. 主备切换机制
概要
Spark Master主备切换可以基于两种机制,一种是基于文件系统的,一种是基于Zookeeper的,基于文件系统
的主备切换机制,需要在Active Master挂掉之后,由我们手动
去切换到Standby Master上;而基于Zookeeper
的主备切换机制,可以实现自动
切换Master。
所以我们接下来重点说说在主Master挂掉后,Standby Master都会做哪些操作。
Standby Master切换步骤
Standby Master切换流程图
- Standby Master首先使用
持久化引擎(FileSystemPersistenceEngine或者ZookeeperPersistenceEngine)去读取持久化的storedApps、storeDrivers、storedWorkers
。
- 判断如果storedApps、storeDrivers、storedWorkers有
任何一个是非空
的话,就将持久化的Applications、Drivers、Workers信息重新进行注册
,注册到Standby Master内存缓存结构中。
将Applications、Workers的状态都修改为UNKNOWN
。然后向Application所对应的Driver以及Worker发送Standby Master的地址。
- Driver和Worker如果都是正常在运作的话,那么收到Standby Master发送来的地址后,就会
更新Master地址,并返回响应给新的Master
。
- 此时Standby Master在陆续接收到Driver和Worker的响应信息后,会调用
competeRecovery
方法对没有发送响应消息的Driver和Worker进行处理,过滤掉他们的信息。
competeRecovery方法
removeWorker方法
- 调用schedule方法,对正在等待资源调度的Driver和Application进行调度。比如在某个worker上启动Driver,或是为Application在某个Worker上启动它需要的Executor等。
二. 注册机制
Master注册机制流程图
由于上面三种注册方式的原理和源码有很多相似之处,所以这里仅对Application的注册进行详解,其他将不再过多累述。
1. Application注册
注册时机
Driver启动后,执行我们编写的Application代码,执行SparkContext初始化,底层的SparkDeployScheduleBackend会通过AppClient内部的线程ClientActor发送RegisterApplication到Master,进行Application的注册。
注册流程及源码分析
- Master接收到Application的注册信息后,用ApplicationDescription信息创建ApplicationInfo对象,将其信息放入到内存缓存app中(HashSet)。
Spark中各个内存缓存的数据结构:
- 将Application加入等待调度的Application队列waitingApps(ArrayBuffer)。
- 用持久化引擎将Application信息持久化(详见RegisterApplication方法中第三步)。
- 调用schedule()方法进行资源管理(详见RegisterApplication方法中第五步)。
2. Worker注册
注册时机
Worker节点在启动后,就会主动向Master进行注册
注册流程分析
- Master接收到Worker节点的注册信息后,将状态为DEAD的Worker过滤掉,对于状态为UNKNOWN的Worker,更新其信息;将Worker加入到内存缓存worker中(HashSet)。
- 用持久化引擎将worker信息持久化。
- 调用schedule()方法进行资源管理。
3. Driver注册
注册时机
spark-submit提交spark Application时,首先就会注册Driver。
注册流程及源码分析
- Master接收到Driver的注册信息后,将其信息放入到内存缓存driver中(HashSet)。
- 将Application加入等待调度的Application队列waitingDrivers(ArrayBuffer)。
- 用持久化引擎将Application信息持久化。
- 调用schedule()方法进行资源管理。
到这里关于Spark Master的核心源码已经剖析了一小半了,有了这一讲的基础,我们下一讲就可以剖析Master最最重要的资源调度算法了!