本文为 Spark 2.0 源码分析笔记,由于源码只包含 standalone 模式下完整的 executor 相关代码,所以本文主要针对 standalone 模式下的 executor 模块,文中内容若不特意说明均为 standalone 模式内容
在 executor 模块中,最重要的几个类(或接口、trait)是:
StandaloneAppClient
类StandaloneSchedulerBackend
类TaskSchedulerImpl
类接下来先简要介绍这几个类的作用以及各自主要的成员和方法,这是理解之后内容的基础
StandaloneAppClient 主要有以下几个作用:
RegisteredApplication
、ApplicationRemoved
、ExecutorAdded
等private val REGISTRATION_TIMEOUT_SECONDS = 20
:注册 application 的超时private val REGISTRATION_RETRIES = 3
:注册 application 的最大重试次数endpoint: ClientEndpoint
:ClientEndpoint 为 StandaloneAppClient 内部嵌套类,主要用来: RegisterApplication
消息来注册 applicationRegisteredApplication
:application 已成功注册ApplicationRemoved
:application 已移除ExecutorAdded
:有新增加的 ExecutorExecutorUpdated
:Executor 发生资源更新MasterChanged
:master 改变StopAppClient
:StandaloneAppClient stop 时通知 ClientEndpoint 也进行 stop 并反注册 applicationRequestExecutors
:StandaloneAppClient 在注册完 Application 后通过 ClientEndpoint 向 master 为执行 Application 的 tasks 申请资源KillExecutors
:StandaloneAppClient 通过 ClientEndpoint 向 master 发送消息来 kill executordef start()
:启动 StandaloneAppClientdef requestTotalExecutors(requestedTotal: Int): Boolean
:为 application 向 master 申请指定总数的 executorsdef killExecutors(executorIds: Seq[String]): Boolean
:通过 ClientEndpoint 向 master 发送消息来 kill 一组 executorsSchedulerBackend 在 Standalone 模式下的 SchedulerBackend 的实现是 StandaloneSchedulerBackend,但是从大体的作用上来说,各个模式下的 SchedulerBackend 作用是相同的,主要为:
def reviveOffers(): Unit
def killTask(...): Unit
低等级的 task 调度接口,当前只有 TaskSchedulerImpl 这一个实现。该接口支持在不同的部署模式下工作。每个 SparkContext(application) 对应唯一的一个 TaskScheduler。 TaskScheduler 从 DAGScheduler 的每一个 stage 获取 tasks,并负责发送到集群去执行这些 tasks,在失败的时候重试,并减轻掉队情况。TaskScheduler 会返回 events 给 DAGScheduler。
def rootPool: Pool
:返回 root 调度对列def schedulingMode: SchedulingMode
:调度模式def submitTasks(taskSet: TaskSet)
:提交任务去集群执行def cancelTasks(stageId: Int, interruptThread: Boolean)
:取消一个 stage 对应的 tasksdef executorHeartbeatReceived(...)
:接收到 executor 心跳信息def executorLost(executorId: String, reason: ExecutorLossReason)
:处理
executor lost以上简要的介绍了 AppClient、SchedulerBackend、TaskScheduler 几个接口,其中 SchedulerBackend 和 TaskScheduler 接口实例是在 SparkContext 构造函数中创建的,而 AppClient 实例是在 SchedulerBackend 构造函数中被创建。
AppClient 的创建与启动也比较简单,主要流程如下:
val (sched, ts) = SparkContext.createTaskScheduler(this, master, deployMode)
来通过 master url 来创建相应模式下的 SchedulerBackend 实例 sched 以及 TaskSchedulerImpl 实例 ts(我们假定这里创建的 sched 是 StandaloneScheduler 类型的)再次说明,以上内容若无特别说明均指 Standalone 模式下的。本文简要的分析了几个关键类以及 AppClient 是如何启动的,更详细的剖析会在后面的文章中说明。