Master的註冊機制和狀態改變管理解密
阿新 • • 發佈:2018-05-24
發生 接受 發送 空值 dto spa 就是 rem 9.png ,Executor、Driver、Worker 三者也會進行溝通,而 Master 不會直接向 Excecutor 進行溝通。
本課主題
- Master 接收 Worker, Driver, Application 註冊
- Master 處理 Driver 狀態變換
- Master 處理 Executor 狀態變換
Master 接受 Driver, Worker, Application 註冊內幕
可以把 Master 想像成公司裏的總經理,Driver 就是客戶,Worker 是每個項目的技術領導,Executor 是實際幹活的工程師,在實際情況下,他們三個會相互溝通,總經理一般都不會直接跟工程師溝通。但客戶、技術領導和工程師一般都會進行溝通。
用這個例子,你就可以理解在 Spark 的世界中Master、Driver、Worker 三者會進行溝通
[下圖是 Master 接收 Worker, Driver, Application 的流程圖]
Master 對其他組件註冊的處理- Master 接受註冊的對象主要是 Driver, Application 和 Worker, 需要補充說明的是 Executor 不會註冊給 Master,Executor 是註冊給 Driver 中的 SchedulerBackend 的;
- Worker 是在啟動之後主動向Master 註冊的,這樣設計有一個很大的好處,就是在生產環境下如果想把新的Worker 加入到已經運行的Spark 集群上,此時不需要重新啟動Spark 集群就能夠使用新加入的Worker 以提升處理能力;Worker 啟動後會調用onStart( ) 方法,然後調用 registerWithMaster( ) 來註冊給Master。
[下圖是 Worker.scala 中的 onStart 方法]
這裏 registerWithMaster( ) 首先會調用 tryRegisterAllMasters( )
[下圖是 Worker.scala 中的 registerWithMaster 方法]
[下圖是 Worker.scala 中的 tryRegisterAllMasters 方法]
這裏發送一個 RegisterWorker 的 case class 去 masterEndpoint
[下圖是 Worker.scala 中的 registerWithMaster 有一個參數的重載方法]
在 RegisterWorker 這個數據結構中具體會有 id、host、port、workerEndPoint、cores、memory、webUiPort、publicAddress 等信息。它會首先判斷一下 host 是不是空值和 port 必須是大於 0
[下圖是 DeployMessage.scala 中 RegisterWorker 的 case class] - Master 接到 Worker 註冊的請求後,首先會判斷一下當前的 Master 是否是 Standby 的模式,如果是的話就不處理,然後會判斷當前 Master 內存的數據結構 idToWorker 中是否已經有該 Worker 的註冊信息,如果有的話此時並不會重覆註冊;
- 通過持久化引擎例如 ZooKeeper 把註冊信息持久化起來
- Master 如果決定接收註冊的Worker,首先會創建 WorkerInfo 對象來保存註冊的 Worker 的信息:然後調用 registerWorker 來執行具體的註冊的過程,如果 Worker 狀態是 DEAD 的狀態則直接過濾掉,對於 UNKNOWN 狀態的內容會調用 removeWorker 方法來進行清理(包括清理該工人下的 Executors 和驅動程序。
- 註冊的時候會先註冊 Driver 然後再註冊 Application
Master 處理 Driver 狀態變換
- Master 對 Driver 和 Executor 狀態變化的出來,只有 Driver 的狀態發生變發就直接調用 removeDriver 方法
- 首先查看有沒有這個 driver,要看看曾經有沒有登記
Master 處理 Executor 狀態變換
- 首先是查詢一次有沒有這個 Executor 註冊的信息,
- Executor 掛掉的時候系統會進行一定次數的重啟(最多重試10次)
[總結部份]
更新中......
Master的註冊機制和狀態改變管理解密