Spark源码剖析(六):Worker原理与源码剖析

上篇文章我们剖析了Master的原理和源码,知道了当Master使用资源分配算法将资源分配完成后,就会给对应的Worker发送启动Driver或者Executor的消息,那么Worker收到这些消息后,具体是怎么启动Driver或者Executor的呢?这篇文章就让我们深入剖析一下Worker的原理和源码。

一、启动Driver

  1. Worker接收到了Master发送过来的启动Driver的信息,LaunchDriver函数首先启动一个DriverRunner线程。

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

Alt text 
  
val driver = new DriverRunner(……)

Alt text

  1. 接着调用DriverRunner的start方法,首先在DriverRunner线程中首先创建Driver的工作目录,下载相关的jar包,封装启动Driver的命令,然后用java的ProcessBuilder启动Driver进程,并在之后对Driver进程进行管理。

driver.start()

Alt text

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

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

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

Alt text 
  
如果还记得Master状态改变处理机制,那么这里就串起来了

Alt text

Alt text 
  
这里可以看出Drive失败后并没有重启策略

由此可知每一个Driver进程在Worker上都对应了一个DriverRunner线程,该线程负责对Driver的管理

二、启动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的管理

三、总结

千言万语不如一张图!

Alt text

posted @ 2018-01-02 16:22  小丑进场  阅读(459)  评论(0编辑  收藏  举报