Spark executor模块① - 主要类以及创建 AppClient

本文为 Spark 2.0 源码分析笔记,由于源码只包含 standalone 模式下完整的 executor 相关代码,所以本文主要针对 standalone 模式下的 executor 模块,文中内容若不特意说明均为 standalone 模式内容

在 executor 模块中,最重要的几个类(或接口、trait)是:

  • AppClient:在 Standalone 模式下的实现是 StandaloneAppClient
  • SchedulerBackend:SchedulerBackend 是一个 trait,在 Standalone 模式下的实现是 StandaloneSchedulerBackend
  • TaskScheduler:TaskScheduler 也是一个 trait,当前,在所有模式下的实现均为 TaskSchedulerImpl

接下来先简要介绍这几个类的作用以及各自主要的成员和方法,这是理解之后内容的基础

StandaloneAppClient(AppClient)

StandaloneAppClient 主要有以下几个作用:

  1. 向 master 注册 application
  2. 接收并处理来自 master 的各种消息,如 RegisteredApplicationApplicationRemovedExecutorAdded
  3. 调用 SchedulerBackend 回调接口以通知各种重要的 event,比如:Application 失败、添加了 executor、executor 更新等

主要成员

  • private val REGISTRATION_TIMEOUT_SECONDS = 20:注册 application 的超时
  • private val REGISTRATION_RETRIES = 3:注册 application 的最大重试次数
  • endpoint: ClientEndpoint:ClientEndpoint 为 StandaloneAppClient 内部嵌套类,主要用来:
    • 通过向 master 发送 RegisterApplication 消息来注册 application
    • 接收来自 master 的消息并处理,消息包括
      • RegisteredApplication:application 已成功注册
      • ApplicationRemoved:application 已移除
      • ExecutorAdded:有新增加的 Executor
      • ExecutorUpdated:Executor 发生资源更新
      • MasterChanged:master 改变
    • 接收来自 StandaloneAppClient 发送的消息并处理,包括:
      • StopAppClient:StandaloneAppClient stop 时通知 ClientEndpoint 也进行 stop 并反注册 application
      • RequestExecutors:StandaloneAppClient 在注册完 Application 后通过 ClientEndpoint 向 master 为执行 Application 的 tasks 申请资源
      • KillExecutors:StandaloneAppClient 通过 ClientEndpoint 向 master 发送消息来 kill executor

主要方法

  • def start():启动 StandaloneAppClient
  • def requestTotalExecutors(requestedTotal: Int): Boolean:为 application 向 master 申请指定总数的 executors
  • def killExecutors(executorIds: Seq[String]): Boolean:通过 ClientEndpoint 向 master 发送消息来 kill 一组 executors

SchedulerBackend

SchedulerBackend 在 Standalone 模式下的 SchedulerBackend 的实现是 StandaloneSchedulerBackend,但是从大体的作用上来说,各个模式下的 SchedulerBackend 作用是相同的,主要为:

  1. 当有新的 task 提交或资源更新时,查找各个节点空闲资源,并确定在哪个 executor 上启动哪个 task 的对应关系,对应的方法是 def reviveOffers(): Unit
  2. 被 TaskScheduler 调用来 kill task,对应的方法是 def killTask(...): Unit

TaskScheduler

低等级的 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 对应的 tasks
  • def executorHeartbeatReceived(...):接收到 executor 心跳信息
  • def executorLost(executorId: String, reason: ExecutorLossReason):处理
    executor lost

以上简要的介绍了 AppClient、SchedulerBackend、TaskScheduler 几个接口,其中 SchedulerBackend 和 TaskScheduler 接口实例是在 SparkContext 构造函数中创建的,而 AppClient 实例是在 SchedulerBackend 构造函数中被创建。

AppClient 的创建与启动

AppClient 的创建与启动也比较简单,主要流程如下:

  1. 在 SparkContext 的构造函数中,调用 val (sched, ts) = SparkContext.createTaskScheduler(this, master, deployMode) 来通过 master url 来创建相应模式下的 SchedulerBackend 实例 sched 以及 TaskSchedulerImpl 实例 ts(我们假定这里创建的 sched 是 StandaloneScheduler 类型的)
  2. 随后,依然是在 SparkContext 的构造函数中,TaskScheduler 实例 ts 调用其 start 方法,在该 start 方法中会调用 SchedulerBackend 实例 sched 的 start 方法(所以,你也可以从这里知道 TaskScheduler 的实现中是包含 SchedulerBackend 的实例的)
  3. 在 SchedulerBackend 的 start 方法中会创建其嵌套类 ClientEndpoint 对象
  4. 在将 ClientEndpoint 对象注册给 rpcEnv 的过程中 ClientEndpoint 对象会收到 OnStart 消息并处理,处理过程主要就是持有 ApplicationDescription(主要包括name, maxCores, memoryPerExecutorMB, 启动命令行, appUiUrl等) 来向 Master 注册 application

再次说明,以上内容若无特别说明均指 Standalone 模式下的。本文简要的分析了几个关键类以及 AppClient 是如何启动的,更详细的剖析会在后面的文章中说明。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,457评论 5 459
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,837评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,696评论 0 319
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,183评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,057评论 4 355
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,105评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,520评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,211评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,482评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,574评论 2 309
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,353评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,213评论 3 312
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,576评论 3 298
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,897评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,174评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,489评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,683评论 2 335

推荐阅读更多精彩内容