Client 向 Master 发起 RequestSubmitDriver 请求,Master 将 DriverInfo 添加待调度列表中 (waitingDrivers),下面针对于 Driver 进一步梳理。
6.7.1 Master 对 Driver 资源分配
大致流程如下:
详解如下:
- waitingDrivers 与 aliveWorkers 进行资源匹配:
- 在 waitingDrivers 循环内,轮询所有 aliveWorker。
- 如果 aliveWorker 满足当前 waitingDriver 资源要求,给 Worker 发送 LaunchDriver 指令并将 waitingDriver 移除 waitingDrivers,则进行下一次 waitingDriver 的轮询工作。
- 如果轮询完所有 aliveWorker 都不满足 waitingDriver 资源要求,则进行下一次 waitingDriver 的轮询工作。
- 所有发起的轮询开始点都上次轮询结束点的下一个点位开始。
6.7.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 的资源。
6.7.3 DriverRunner 创建并运行 DriverWrapper
DriverWrapper 的运行,流程如下:
详解如下:
- DriverWapper 创建了一个 RpcEndpoint 与 RpcEnv。
- RpcEndpoint 为 WorkerWatcher,主要目的为监控 Worker 节点是否正常,如果出现异常就直接退出。
- 然后当前的 ClassLoader 加载 userJar,同时执行 userMainClass。
- 执行用户的 main 方法后关闭 workerWatcher。