简介
弹性资源组件提供动态资源能力,是分布式系统关键基础设施,分布式datax,分布式索引,事件引擎都需要集群和资源的弹性资源能力,提高伸缩性和作业处理能力。
本文介绍弹性资源组件的设计,包括架构设计和详细设计,指导开发人员代码开发,设计基于《flink原理源码分析(一) 集群与资源@k8s》,抽出作业管理器,包括其内部的调度器,通用化为资源消费者,标准化与资源管理器和任务管理器的交互接口;增加约束,如,组件间通讯rpc组件,高可用组件,心跳组件等,最大程度使用原flink代码,后续的迭代不断标准化,抽象化交互接口,支持不同的实现。
本文是资源管理器设计第二部分,资源注册,检查资源请求/检查资源声明
技术架构
弹性资源组件的技术架构图,其中作业管理器接入系统提供,需实现与资源管理器和任务管理器的交互, 还有一些技术要求。
总体架构是master-worker,master的高可用是k8s的复制机制提供,选主机制k8s提供,作业管理器和资源管理器参与选主,作业管理器/任务管理器接入资源管理器主节点监听,获取最新资源管理器;作业管理器接入作业管理器主节点监听,获取最新的作业管理器主节点
数据架构,资源是组件的核心数据,分两条线a线 现有资源,b线 待定资源
- 4资源请求->5a 分配可用资源-> 6a 请求使用资源-> 7a 提供资源->8a 提交任务
- 4资源请求->5b 分配待定资源-> 6b 请求新worker-> 7b 启动任务管理器->8b 注册/报告资源
a线是分配现有资源;b线请求新资源,新资源注册后是现有资源,在a线分配
组件架构
上图弹性资源组件架构,作为SDK,提供RPC,slot池,心跳,高可用等组件支持,这些组件有约束的,有可选用的
资源管理器模块
资源管理器负责注册资源,管有资源,处理资源请求,按需请求新资源
注册/报告资源
任务管理器启动后,注册到资源管理器,报告自身资源
- 任务管理器启动,同时启动高可用组件,触发ResourceManagerLeaderListener监听机制
- ResourceManagerLeaderListener调用TaskExecutor的notifyOfNewResourceManagerLeader方法,通知TaskExecutor新的资源管理器leader诞生
- notifyOfNewResourceManagerLeader方法使用RegisteredRpcConnection连接到资源管理器
- RegisteredRpcConnection连接完成后,触发事件onRegistrationSuccess,onRegistrationSuccess调用资源管理器的sendSlotReport(rpc)方法报告资源
- ResourceManager的sendSlotReport方法,调用SlotManager注册任务管理器和登记资源
- 最后,新资源登记完成,资源变更了,采用延时异步方式执行《检查资源需求》,再分配资源
检查资源需求/检查资源声明
检查资源需求/检查资源声明是资源管理的核心方法,属于内部用例,本章解释一下设计原理
上面的资源域场景分为两类,提出资源需求和提供资源, 检查资源请求/检查资源声明是交汇点,检查资源请求,该分配的分配,该请求新的请求新的资源;检查资源声明,哪些资源可以释放,需要新资源请求新worker。
本章深入分析两方法,上游提出资源需求和下游提供资源的串联,资源状态演变,存储型态
检查资源需求(checkResourceRequirements)
检查资源需求是真正的分配资源,上面说的分配只是增加请求
获取作业的未完成资源请求
尝试分配可用资源到作业
之所以尝试,资源变更触发调用检查资源请求,但不一定是增加,可能是无效分配
slotTracker获取所有可用资源,与请求匹配,合适的分配allocateSlot,该方法对应场景请求使用资源/提供资源
尝试使用待定的资源
待定资源是指申请了新的worker或者将要申请新worker所产生的资源,两者都是目前没有物理上的对应资源,通俗说就是先占个坑,等申请了资源再填回去
同样,首先匹配现有的待定资源,若还有未分配创建新的待定资源
tryAllocateWorkerAndReserveSlot调用TaskExecutorManager的allocateWorker,创建待定资源PendingTaskManagerSlot,预先挖好”坑”
declareNeededResourcesWithDelay方法下节介绍,按需要申请新的worker,增加物理资源
到此还有一个问题,物理资源到位后怎样填待定资源的”坑”
自然想到注册任务管理器/报告资源,使用新增资源抵消待定资源,填”坑”
TaskExecutorManager的registerTaskManager方法
检查资源声明(checkResourceDeclarations)
声明资源,要申请多少资源,可释放多少资源,上一节检查资源请求打开新待定资源,最终调用checkResourceDeclarations实际申请新worker获得物理资源,为了支持动态/静态资源申请,中间ResourceAllocator转接了一下,这里不详细分析
现有的worker数量-需要的worker数量,大于0,worker多了,可以释放;反之,worker少了,需要打开新worker
requestNewWorker参看请求新worker
ResourceDeclaration怎么来?
主要是计算totalWorkerNum,现有worker总数量
totalWorkerNum = pendingWorkerNum + neededRegisteredWorkers
pendingWorkerNum 待定的slots除以每个worker的slots,向上修正,只多不少
neededRegisteredWorkers是已经注册的worker减去待释放的worker