承接上一節內容,Client向Master發起RequestSubmitDriver請求,Master將DriverInfo添加待調度列表中(waitingDrivers),下面針對於Driver進一步梳理
1、Master對Driver資源分配
大體流程以下:
waitingDrivers與aliveWorkers進行資源匹配,
- 在waitingDrivers循環內,輪詢全部aliveWorker
- 若是aliveWorker知足當前waitingDriver資源要求,給Worker發送LaunchDriver指令並將 waitingDriver移除waitingDrivers,則進行下一次waitingDriver的輪詢工做
- 若是輪詢完全部aliveWorker都不知足waitingDriver資源要求,則進行下一次waitingDriver的輪詢工做
- 全部發起的輪詢開始點都上次輪詢結束點的下一個點位開始
2、Worker運行DriverRunner
Driver的啓動,流程以下:
- 當Worker遇到LaunchDriver指令時,建立並啓動一個DriverRunner
- DriverRunner啓動一個線程【DriverRunner for [driverId]】處理Driver啓動工做
- 【DriverRunner for [driverId]】:
-
- 添加JVM鉤子,針對於每一個diriverId建立一個臨時目錄
- 將DriverDesc.jarUrl經過Netty從Driver機器遠程拷貝過來
- 根據DriverDesc.command模板構建本地執行的command命令,並啓動該command對應的Process進程
- 將Process的輸出流輸出到文件stdout/stderror,若是Process啓動失敗,進行1-5的秒的反覆啓動工做,直到啓動成功,在釋放Worker節點的DriverRunner的資源
3、
DriverRunner建立並運行DriverWrapper
DriverWrapper的運行,流程以下:
- DriverWapper建立了一個RpcEndpoint與RpcEnv
- RpcEndpoint爲WorkerWatcher,主要目的爲監控Worker節點是否正常,若是出現異常就直接退出
- 而後當前的ClassLoader加載userJar,同時執行userMainClass
- 執行用戶的main方法後關閉workerWatcher