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

相關文章
相關標籤/搜索