Spark源碼剖析(六):Worker原理與源碼剖析

上篇文章咱們剖析了Master的原理和源碼,知道了當Master使用資源分配算法將資源分配完成後,就會給對應的Worker發送啓動Driver或者Executor的消息,那麼Worker收到這些消息後,具體是怎麼啓動Driver或者Executor的呢?這篇文章就讓咱們深刻剖析一下Worker的原理和源碼。java

1、啓動Driver

  1. Worker接收到了Master發送過來的啓動Driver的信息,LaunchDriver函數首先啓動一個DriverRunner線程。

worker.actor ! LaunchDriver(driver.id, driver.desc)算法

Alt text 
  
val driver = new DriverRunner(……)app

Alt text

  1. 接着調用DriverRunner的start方法,首先在DriverRunner線程中首先建立Driver的工做目錄,下載相關的jar包,封裝啓動Driver的命令,而後用java的ProcessBuilder啓動Driver進程,並在以後對Driver進程進行管理。

driver.start()函數

Alt text

Alt text 
  
launchDriver(builder, driverDir, driverDesc.supervise)fetch

Alt text 
  
runCommandWithRetry(ProcessBuilderLike(builder), initialize, supervise)ui

Alt text 
  
worker ! DriverStateChanged(driverId, state, finalException)spa

Alt text 
  
若是還記得Master狀態改變處理機制,那麼這裏就串起來了線程

Alt text

Alt text 
  
這裏能夠看出Drive失敗後並無重啓策略code

由此可知每個Driver進程在Worker上都對應了一個DriverRunner線程,該線程負責對Driver的管理進程

2、啓動Executor

  1. Worker接收到了Master發送過來的啓動Executor的信息,LaunchExecutor函數首先啓動一個ExecutorRunner線程。

worker.actor ! LaunchExecutor(……)

Alt text

Alt text

  1. 在ExecutorRunner線程中首先建立Executor的工做目錄,下載相關的jar包,封裝啓動Executor的命令,而後用java的ProcessBuilder啓動Executor進程,並在以後對Executor進程進行管理。

manager.start()

Alt text 
  
fetchAndRunExecutor()

Alt text

Alt text 
  
worker ! ExecutorStateChanged(appId, execId, state, Some(message), Some(exitCode))

Alt text 
  
master ! ExecutorStateChanged(appId, execId, state, message, exitStatus)

Alt text

Alt text 
  
這裏能夠看出Executor失敗後有重啓策略,每一個Application最大重啓次數爲10

由此可知每個Executor進程在Worker上都對應了一個ExecutorRunner線程,該線程負責對Executor的管理

3、總結

千言萬語不如一張圖!

Alt text

相關文章
相關標籤/搜索