Client Master 发起 RequestSubmitDriver 请求,Master 将 DriverInfo 添加待调度列表中 (waitingDrivers),下面针对于 Driver 进一步梳理。

6.7.1 Master 对 Driver 资源分配

大致流程如下:

6hsw2plxj5.png

详解如下:

  1. waitingDrivers aliveWorkers 进行资源匹配:
    1. 在 waitingDrivers 循环内,轮询所有 aliveWorker。
    2. 如果 aliveWorker 满足当前 waitingDriver 资源要求,给 Worker 发送 LaunchDriver 指令并将 waitingDriver 移除 waitingDrivers,则进行下一次 waitingDriver 的轮询工作。
    3. 如果轮询完所有 aliveWorker 都不满足 waitingDriver 资源要求,则进行下一次 waitingDriver 的轮询工作。
    4. 所有发起的轮询开始点都上次轮询结束点的下一个点位开始。

6.7.2 Worker 运行 DriverRunner

Driver 的启动,流程如下:

6hsw2plxj5.png

详解如下:

  1. Worker 遇到 LaunchDriver 指令时,创建并启动一个 DriverRunner
  2. DriverRunner 启动一个线程 DriverRunner for [driverId] 处理 Driver 启动工作。
  3. DriverRunner for [driverId]:
    1. 添加 JVM 钩子,针对于每个 diriverId 创建一个临时目录。
    2. DriverDesc.jarUrl 通过 Netty 从 Driver 机器远程拷贝过来。
    3. 根据 DriverDesc.command 模板构建本地执行的 command 命令,并启动该 command 对应的 Process 进程。
    4. 将 Process 的输出流输出到文件 stdout/stderror,如果 Process 启动失败,进行 1-5 的秒的反复启动工作,直到启动成功,在释放 Worker 节点的 DriverRunner 的资源。

6.7.3 DriverRunner 创建并运行 DriverWrapper

DriverWrapper 的运行,流程如下:

6xbnk1nyck.png

详解如下:

  1. DriverWapper 创建了一个 RpcEndpoint RpcEnv
  2. RpcEndpoint WorkerWatcher,主要目的为监控 Worker 节点是否正常,如果出现异常就直接退出。
  3. 然后当前的 ClassLoader 加载 userJar,同时执行 userMainClass。
  4. 执行用户的 main 方法后关闭 workerWatcher。