本文为 Spark 2.0 源码分析笔记,由于源码只包含 standalone 模式下完整的 executor 相关代码,所以本文主要针对 standalone 模式下的 executor 模块,文中内容若不特意说明均为 standalone 模式内容
在介绍AppClient 向 Master 注册 Application的过程中,我们知道 Master 在处理 AppClient 的注册消息时,会进行调度,调度的过程中会决定在某个 worker 上启动某个(或某些) executor,这时会向指定的 worker 发送 LaunchExecutor
消息,本文将对 worker 接收到该消息后如何启动 executor 进行剖析。
worker 接收到 LaunchExecutor
消息后的处理流程如下图所示,主要有四个步骤,我们仅对最关键的创建 ExecutorRunner 对象的创建与启动进行分析
ExecutorRunner 是用来管理 executor 进程的,只在 Standalone 模式下有。创建 ExecutorRunner 对象 manager 时,仅对其成员变量做了简单的初始化。关键还是在于 manager 调用的 start()
方法,该方法实现如下:
那么上图中在 start() 方法中新创建的线程中调用的 ExecutorRunner#fetchAndRunExecutor
又做了什么呢?该方法主要做了以下事情:
RegisteredExecutor
消息RegisteredExecutor
消息后,会创建一个 Executor。至此,Executor 创建完毕(Executor 在 Mesos、YARN、Standalone 模式下都是相同的,不同的只是资源的分配方式)其中,在创建、启动或等待 CoarseGrainedExecutorBackend 进程的过程中:
InterruptedException
类型异常,表明 worker 进程被强制 kill, 则将 Executor 状态置为 KILLED 并调用 killProcess 方法来结束 CoarseGrainedExecutorBackend 进程至此,我们完成了对 executor 启动过程的分析。