上篇文章咱們剖析了Master的原理和源碼,知道了當Master使用資源分配算法將資源分配完成後,就會給對應的Worker發送啓動Driver或者Executor的消息,那麼Worker收到這些消息後,具體是怎麼啓動Driver或者Executor的呢?這篇文章就讓咱們深刻剖析一下Worker的原理和源碼。java
DriverRunner
線程。worker.actor ! LaunchDriver(driver.id, driver.desc)
算法
val driver = new DriverRunner(……)
app
ProcessBuilder
啓動Driver進程,並在以後對Driver進程進行管理。driver.start()
函數
launchDriver(builder, driverDir, driverDesc.supervise)
fetch
runCommandWithRetry(ProcessBuilderLike(builder), initialize, supervise)
ui
worker ! DriverStateChanged(driverId, state, finalException)
spa
若是還記得Master狀態改變處理機制,那麼這裏就串起來了
線程
這裏能夠看出Drive失敗後並無重啓策略
code
由此可知每個Driver進程在Worker上都對應了一個DriverRunner線程,該線程負責對Driver的管理進程
ExecutorRunner
線程。worker.actor ! LaunchExecutor(……)
ProcessBuilder
啓動Executor進程,並在以後對Executor進程進行管理。manager.start()
fetchAndRunExecutor()
worker ! ExecutorStateChanged(appId, execId, state, Some(message), Some(exitCode))
master ! ExecutorStateChanged(appId, execId, state, message, exitStatus)
這裏能夠看出Executor失敗後有重啓策略,每一個Application最大重啓次數爲10
由此可知每個Executor進程在Worker上都對應了一個ExecutorRunner線程,該線程負責對Executor的管理
千言萬語不如一張圖!