Spark Worker原理和源码剖析解密:Worker工作流程图、Worker启动Driver源码解密、Worker启动Executor源码解密等
本课主题
- Spark Worker 原理
- Worker 启动 Driver 源码鉴赏
- Worker 启动 Executor 源码鉴赏
- Worker 与 Master 的交互关系
Spark Worker 原理图

Worker 启动 Driver 源码鉴赏
- 因为 Worker 中有消息的循环体,可以用来接收消息,接上一章介绍当 Master 把一个 LaunchDriver 发送到 Worker 的时候,Worker 接收这个 LaunchDriver 然后创建一个新的 DriverRunner 实例,我们这里重点研究 LaunchDriver,当启动 Driver 或者是 Executor 的时候,它必需是满足内存的要求的。当实际上不一定会满足 Core 的要求的,也就是说实际分配的 Core 可能比你期待的 Core 多、也有可能比它少 (为什么呢?)
![]()
在这里首先创建一个 DriverRunner 的实例对象,然后把实例交给 drivers 数据结构 (HashMap[String, DriverRunner]) 来保存信息,这个数据结构很重要,因为在 Worker 下可能启动很多不同的 Executor,你可以理解 DriverRunner 为Driver 进程本身的一个proxy [代理模式],调用它的start( ) 方法并记录一下 coreUsed 和 memoryUsed 的数据。![]()
Cluster 中的 Driver 失败的時候,如果 Supervise 為 true,則启动該 Driver 的Worker 会负责重新启动该 Driver;![]()
![]()
- 在start( )的方法中会创建一个新的进程;具体代码运行顺序:new Thread( ) --> 创建一个本地目录和下载相关的 Jar包 --> launchDriver( ) --> 判断并收集它的状态 --> 再发送给 Worker 一个状态变化的消息。补充说明:Executor 和 ExecutorBackend 是一对一的关系,一个ExecutorBackend进程里面有一个Executor,而在Executor内部它是通过线程池并发处理的方式来处理我们 Spark 提交过来的 Task。Executor 启动后需要向 Driver 注册,具体是注册给 SparkDeploySchedulerBackend实例。
![]()
在本地创建了的一个工作目录![]()
从 HDFS 上获取相关的依赖包 Jar 到本地,因为你提交程序的时候是提交给Spark集群的。![]()
- Worker 是实现RPC通信的,否则别人无法给你发消息的,可以初步看一下类的说明,你会发现它是继承著 ThreadRpcEndPoint (在这里先不深入探讨 RpcEndPoint 的机制,如果想了解可以看点击这篇博客)
- 通过Command PrcoessBuilder
![]()
![]()
![]()
- 启动Driver e.g. launchDriver
![]()
![]()
DriverRunner 启动進程是通過 ProcessBuilder 中的 process.get.waitFor 來完成的。![]()
当Driver 的状态改变的时候
- Worker 接收 DriverStatedChanged 信息
![]()
![]()
![]()
然后把信息发送给Master![]()
Master 收到 Worker 发送过来的 Driver状态信息
- 判断Driver的状态然后把 ERROR、FINISHED、KILLED 和 FAILED 的 driver 删取掉
![]()
![]()
Worker 启动 Executor 源码鉴赏
- Worker 收到 LaunchExecutor 的信息
![]()
![]()
![]()
![]()
![]()
当Executor 的状态改变的时候
- 向 Worker 发送一个 ExecutorStatedChange 的信息
![]()
在Worker 中收到这个信息后调用 handleExecutorStateChanged 方法![]()
![]()
Master 收到 Worker 发送过来的 Executor 状态信息
- Master 收到 Worker 的发送的 ExecutorStateChanged 信息
![]()
![]()
![]()
Worker 与 Master 的交互关系
[总结部份]
更新中......




























浙公网安备 33010602011771号