Apache Flink 源码解析(三)Flink on Yarn (2) Resource Manager

杂谈

首先声明一下,这篇文章很杂,涉及到了挺多的模块,其实应该分为几篇来写更为合理,不过一口气写完了也就先发出来了,后续有空看看能不能改一下。

概述

本文介绍了Flink在Yarn上面的资源申请的流程和机制,屏蔽了具体运行的细节。

YarnResourceManager

  • Flink的YarnResourceManager是ApplicationMaster中负责向Yarn申请资源和分配资源的模块。它有两个重要的成员变量AMRMClientAsync和NMClient,AMRMClientAsync负责向Yarn申请和释放Container,并且会调用三个非常关键的回调方法(YarnResourceManager实现AMRMClientAsync.CallbackHandler接口,实现了这三个方法)。NMClient则负责给申请到的Container提供启动YarnTaskExecutorRunner所需的Context(环境,依赖,命令等等)以及停止Container。
  • 首先看YarnResourceManager的类图。


    YarnResourceManager UML
  • YarnResouceManager继承了ResourceManager抽象类和 AMRMClientAsync的CallbackHandler接口。

    ResourceManager抽象类

    • 首先是ResourceManager这个抽象类,它有三个实现类,Standalone,Mesos和Yarn,分别针对三种不同的资源管理模式,所以它将于TaskExecutor容器申请无关的逻辑都提取了出来。ResourceManager类实现了LeaderContender和ResourceManagerGateway这两个接口。LeaderContender接口用于接收LeaderElectionService的回调,在高可用模式下确定主ResourceManager。如果一个ResouceManager成为Leader,它实现的grantLeadership方法会被调用。


      ResourceManager grantLeadership方法
    • 在该方法中,会启动和这个ResourceManager相关联的SlotManager。Slot是比TaskExecutor更细粒度的资源抽象。一个TaskManager中包含一个或多个Slot。SlotManager会针对每个SlotRequest分配一个Slot, 如果已有的TaskManager没有足够的Slot,SlotManager会向ResourceManager申请新的TaskManager(在启动或者某个TaskExecutor挂掉的情况下会出现这种情况,关于Slot相关内容后续可能会有文章细说,现在可以当成具体执行任务的最小单位的抽象)。

    • 此外,ResourceManager中还有registerJobManager和registerTaskExecutor方法,是由JobManager和TaskManager启动后触发connectToResourceManager,然后调用RPC方法到ResourceManager上注册。在registerJobManager方法中会调用registerJobMasterInternal方法,做了旧的JobManager的清理以及新的JobManager的注册与心跳监控。在registerTaskManager方法中会调用registerTaskManagerInternal方法,这个方法中会将拥有同一个ResourceID的TaskManager从taskExecutors成员变量中移除,并从SlotManager中将这个TaskExecutor中的所有Slot移除。然后将TaskExecutor与YarnWorkerNode的映射关系放入taskExecutors成员变量,最后还要监控TaskExecutor的心跳。当两者心跳超时,jobManagerHeartbeatManager和taskManagerHeartbeatManager分别会回调JobManagerHeartbeatListener和TaskManagerHeartbeatListener的notifyHeartbeatTimeout方法,做清理和断开连接的操作。

容器申请整条链路

  • 之前将ResourceManager介绍了大概,之后会从发起一个SlotRequest来讲资源申请的一整条链路,会涉及到几个重要的方法(文章开头提到的AMRMClientAsync.CallbackHandler接口的三个方法之一的onContainerAllocated)。

  • 在这儿会屏蔽Execution的细节。

    流程

    • 首先SlotPool中的requestNewAllocatedSlot方法被调用入参包含了SlotRequestId和ResourceProfile。


      SlotPool.requestNewAllocatedSlot
    • 这个方法会判断是否有resourcemanager,如果有就会调用requestSlotFromResourceManager并将这个SlotRequest放入SlotPool的一个缓存pendingRequests中并通过rpc调用ResourceManager的requestSlot函数来申请Slot。


      SlotPool.requestSlot
    • 这个rpc调用之后又回到了ResourceManager,ResourceManager将请求通过registerSlotRequest转交给SlotManager,SlotManager会先将请求加入到pendingSlotRequests缓存(注意这儿不是SlotPool的pendingSlotRequests),然后调用internalRequestSlot方法。


      ResourceManager.requestSlot
    • 在internalRequestSlot方法中,根据SlotRequest先找到是否有TaskManager有可用的Slot,如果有,就向那个TaskManager申请Slot。如果没有,就会调用allcoateResource来向ResourceManager申请新的容器(ResourceManager中的内部类ResourceActionImpl实现了这儿的ResourceAction接口)。

    • SlotManager.internalRequestSlot
    • 这个allocateResource方法被调用后,会调用startNewWorker来启动一个新的容器,而startNewWorker是ResourceManager的一个抽象方法,在YarnResourceManager中实现了该方法。

    • ResourceManager.allocateResource
    • 在startNewWorker方法中,封装了向Yarn申请资源的Resource之后,并在requestYarnContainer方法中,通过异步的Yarn的AMRMClientAsync来申请容器。

    • YarnResourceManager.startNewWorker
    • 当Yarn的容器分配好了之后,会调用YarnResourceManager实现的回调方法onContainerAllocated。在这儿,会将超发的container release调,而所需的container则会将于ResourceID的映射放入workerNodeMap缓存,并且通过NMClient(nodeManagerClient)来启动YarnTaskExecutorRunner进程。

    • onContainerAllocated
    • 至此,Yarn申请资源的阶段就已经完成,而停止Worker,或者Container意外退出的逻辑就不多说了,相信看完这整个链路知道怎么去快速的阅读了。

总结

本文简要介绍了Flink在Yarn上的Application Master的设计,并且使用一个例子来过完整个流程,至于什么时候触发的SlotRequest这个并没有提及,和Flink的runtime有密不可分的关系。

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

推荐阅读更多精彩内容