【Spark2.0源碼學習】-7.Driver與DriverRunner

     承接上一節內容,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
相關文章
相關標籤/搜索