Flink 的集群资源管理

集群资源管理
一、ResourceManager 概述

1、ResourceManager 作为统一的集群资源管理器,用于管理整个集群的计算资源,包括 CPU资源、内存资源等。

2、ResourceManager 负责向集群资源管理器申请容器资源启动TaskManager实例,并对TaskManager进行集中管理。

3、当新的 Job 提交到集群后,JobManager 会向 ResourceManager 申请作业执行需要的计算资源,进而完成整个作业的运行。

二、ResourceManager 分类

在ResourceManager抽象实现类的基础上,分别实现了ActiveResourceManager、StandaloneResourceManager以及MesosResourceManager等子类。

其中ActiveResourceManager实现了动态资源管理,可以根据提交的作业动态选择启动或停止TaskManager实例。

目前支持TaskManager动态管理和启动的ResourceManager主要有KubernetesResourceManager和YarnResourceManager实现类。

三、ResourceManager 功能

ResourceManager通过实现ResourceManagerGateway接口,向其他组件提供RPC远程访问能力,如TaskManager服务和JobManager服务的ResourceManagerGateway会将RPC访问请求发送到ResourceManager服务中。

ResourceManager继承了FencedRpcEndpoint基本实现类,使得ResourceManager可以作为一个RpcEndpoint节点,通过ResourceManagerGateway接口提供给其他服务节点,使之能够以RPC的方式访问ResourceManager服务。

ResourceManager实现了LeaderContender接口,可以作为竞争节点让LeaderElectionService进行Leader节点的选举,保证整个集群ResourceManager组件服务的高可用。

四、ResourceManager主要成员变量

resourceld:ResourceManager对应的唯一资源ID。

jobManagerRegistrations:专门存储JobManager注册信息。其中Key为JoblD,Value为JobManagerRegistration,当启动JobManager服务时,就会将JobManager信息注册在jobManagerRegistrations实例中。

jmResourceldRegistrations:用于存储JobManager注册信息,与jobManagerRegistrations的区别在于Key为ResourcelD。

jobLeaderldService:用于获取Job Leader ID的服务,在开启的高可用集群中,当JobManager的Leader节点发生切换时,会借助jobLeaderldService获取当前作业有效的JobID和地址信息。

taskExecutors:注册在ResourceManager的TaskExecutor列表中,其中Key为TaskExecutor对应的ResourcelD,Value为WorkRegistration,即TaskExecutor向ResourceManager注册过程中所提供的信息。

taskExecutorGatewayFutures:专门存储TaskExecutorGateway的CompletableFuture对象,Key为TaskExecutor对应的ResourcelD,Value为CompletableFuture,用于获取TaskExecutorGateway,实现与TaskExecutor之间的RPC通信。

highAvailabilityServices:系统高可用服务,基于highAvailabilityServices服务支持组件高可用。

heartbeatServices:用于创建HeartbeatManager服务,和其他组件之间建立心跳连接。

fatalErrorHandler:系统异常错误处理,当ResourceManager出现异常时调用fatalErrorHandler处理异常错误。

slotManager:ResourceManager的内部组件,用于管理集群的可用Slot资源,同时接收并处理TaskExecutor的SlotReport。

clusterinformation:存储整个Flink集群共享的信息,包括blobServerHostname和blobServerPort等配置。

resourceManagerMetricGroup:ResourceManager的MetricGroup用于收集和ResourceManager相关的监控指标。

leaderElectionService:基于ZooKeeper实现的Leader选举服务,在这里用于实现ResourceManager组件高可用。

taskManagerHeartbeatManager:管理与TaskManager之间的心跳信息。

jobManagerHeartbeatManager:管理与JobManager之间的心跳信息。

clearStateFuture:用于停止ResourceManager后进行数据异步清理。

五、ResourceManagerGateway 接口详解
1、概述

ResourceManagerGateway 接口提供了 ResourceManager 需要的RPC方法,供其他集群组件调用。

2、调用关系图

例如在TaskExecutor中调用ResourceManagerGateway完成在ResourceManager中注册TaskExecutor的操作,通过对ResourceManagerGateway中提供的RPC方法进行梳理,得到JobManager、TaskExecutor、WebMonitorEndpoint和Dispatcher等组件与ResourceManagerGateway之间的RPC调用关系图。

JobManager、TaskExecutor、WebMonitorEndpoint和Dispatcher组件使用如下方法与ResourceManager服务进行交互

1.JobManager和ResourceManager的RPC调用

registerJobManager(): 在ResourceManager中注册JobManager服务,此时会在jobLeaderldService服务中添加注册的JobManager信息

requestSlot(): JobManager向ResourceManager申请运行Task所需的Slot资源。

heartbeatFromJobManager(): 用于在JobManager与ResourceManager之间建立长期的心跳连接

disconnectJobManager(): 根据JobID删除之前注册在ResourceManager中的JobManager信息,并且关闭JobManager与ResourceManager之间的RPC连接。

2.TaskExecutor和ResourceManager的RPC调用

heartbeatFromTaskManager(): 在TaskExecutor中调用heartbeatFromTaskManager()方法,构建TaskExecutor与ResourceManager之间的心跳连接。

disconnectTaskManager():停止TaskExecutor组件时会调用disconnectTaskManager()方法断开TaskExecutor与ResourceManager之间的RPC连接。

registerTaskExecutor(): 当新的TaskExecutor启动时,会调用该方法向ResourceManager注册TaskExecutor信息。

sendSlotReport(): 当TaskExecutor启动并注册成功后,会调用sendSlotReport()方法向ResourceManager上报SlotReport。SlotReport中包含TaskExecutor的资源数量和配置信息等内容。

notifySlotAvailable(): 当TaskExecutor中具有空闲Slot计算资源时,会调用notifySlotAvailable()方法通知ResourceManager将该Slot资源变为Available状态。

cancelSlotRequest(): 取消JobManager已经分配的资源。

3.Dispatcher和ResourceManager的RPC调用

requestResourceOverview(): 用于在Dispatcher中获取集群资源信息,包括集群中的TaskManager、numberRegisteredSlots以及numberFreeSlots数量。

requestTaskManagerMetricQueryServiceAddresses(): 从ResourceManager获取TaskManager的MetricQueryService路径,主要用于前端获取TaskManager的监控指标。

4.WebMonitorEndpoint和ResourceManager的RPC调用

requestTaskManagerinfo(): 用于获取TaskManager的相关信息,即TaskExecutor启动过程中注册在ResourceManager的信息,包括TaskExecutor的网关地址、端口以及TaskExecutor的硬件信息。

requestTaskManagerFileUpload(): 请求上传文件到BlobServer上,返回TransientBlobKey。

六、Slot计算资源管理
1、概述

ResourceManager内部主要通过SlotManager服务统一对整个集群的Slot计算资源进行管理。

Slot被称为资源卡槽,用于表示可以分配的最小计算资源单位,提交的Task最终会运行在Slot表示的计算资源中。

2、组件
1)SlotManager 包含了Register Slot和Free Slot两个键值对集合

其中Register Slot专门存储ResourceManager中所有已经注册的TaskManagerSlot信息,FreeSlot集合则存储了当前SlotManager中处于空闲状态且还没有被分配和使用的Slot集合。

  	/** Map for all registered slots. */
    private final HashMap<SlotID, TaskManagerSlot> slots;

    /** Index of all currently free slots. */
    private final LinkedHashMap<SlotID, TaskManagerSlot> freeSlots;
2)TaskManagerSlot对象包含了SlotID、ResourceProfile以及TaskExecutorConnection等信息

如果Slot被分配使用,在TaskManagerSlot中还会存储AllocationID和JobID等分配信息,表明当前Slot已经被指定JobID对应的JobManager使用。

3)SlotManager还包含了pendingSlotRequests 和 fulfilledSlotRequests 两个键值对集合

其中 pendingSlotRequests 存储了所有处于 pending 和 unfulfilled 状态的 Slot 请求。

fulfilledSlotRequests 存储了所有已经分配完成的Slot请求。

		/** Map of fulfilled and active allocations for request deduplication purposes. */
    private final HashMap<AllocationID, SlotID> fulfilledSlotRequests;

    /** Map of pending/unfulfilled slot allocation requests. */
    private final HashMap<AllocationID, PendingSlotRequest> pendingSlotRequests;

Slot 资源申请都会以 PendingSlotRequest 的形式存储在 pendingSlotRequests 集合中,等待 SlotManager 根据当前集群的 Slot 资源进行分配。

当符合条件的 Slot 资源分配给指定的 PendingSlotRequest 后,会为其创建 Allocationld,并将分配了 Allocationld 和 Slotld 信息的SlotRequest 存储到 fulfilledSlotRequests 集合中。

3、流程图
1)Slot计算资源的注册和管理
1.概述

对Slot计算资源的注册和管理,主要是在TaskManager和ResourceManager服务之间进行的,TaskManager作为Slot计算资源的提供方,ResourceManager则作为Slot计算资源的接收和管理方,梳理TaskManager向SlotManager中注册Slot资源的整个过程。

2.流程

a)启动TaskManager后,调用ResourceManagerGateway.registerTaskExecutor()方法向ResourceManager中注册TaskManager连接信息。

b)创建TaskManager和ResourceManager之间的RPC连接,TaskManager调用ResourceManagerGateway.sendSlotReport()方法向ResourceManager发送SlotReport信息,接着ResourceManager调用SlotManager.registerTaskManager()方法,将TaskManager的资源信息写入SlotManager。

c)在SlotManager中根据SlotReport中的Slot信息创建TaskManagerSlot,并注册到SlotManager的HashMap<SlotID,TaskManagerSlot> slots集合中。

SlotManager含有HashMap<SlotID,TaskManagerSlot> slots和LinkedHashMap<SlotlD,TaskManagerSlot> freeSlots两个Slot集合。前者维护所有注册到SlotManager中的Slot计算资源,后者存储当前SlotManager中可用的Slot资源。

2)为作业申请Slot计算资源
1.概述

在SIotManager中完成SIot资源注册后,等待集群提交和运行作业。

JobManager通过调用ResourceManagerGateway中的相关方法为作业申请Slot计算资源。

2.流程

a)JobManager调用ResourceManagerGateway.requestSlot()方法向ResourceManager发起Slot计算资源申请。

b)ResourceManager内部会调用SlotManager.registerSlotRequest()方法,向SlotManager申请作业需要的Slot计算资源。

c)SlotManager中维护了HashMap<AllocationlD,PendingSlotRequest>pendingSlotRequests集合,将所有的PendingSlotRequest存储在该集合中,并根据SlotRequest的ResourceProfile匹配合适的Slot计算资源,然后对Slot进行分配。

当 SlotRequest 需要的 Slot 计算资源分配完毕后,将已经分配的 SlotlD 信息写入 HashMap<AllocationlD,SlotlD> fulfilledSlotRequests集合。

SlotManager 组件会对 Slot 进行统一的管理,在内部构建一个 Slot 计算资源池,有新的 Slot 注册时,会优先从 pendingSlotRequests 集合中获取处于 Pending 状态的 SlotRequest,并为该 SlotRequest 分配Slot计算资源。

3)流程图
相关推荐
牛马程序员‍38 分钟前
云岚到家项目100问 v1.0
大数据·apache
撸码到无法自拔2 小时前
MATLAB中处理大数据的技巧与方法
大数据·开发语言·matlab
三月七(爱看动漫的程序员)2 小时前
Genetic Prompt Search via Exploiting Language Model Probabilities
大数据·人工智能·算法·语言模型·自然语言处理·prompt
forestsea4 小时前
【Elasticsearch】聚合分析:管道聚合
大数据·elasticsearch·搜索引擎
铭毅天下4 小时前
Elasticsearch 性能测试工具 Loadgen 之 001——部署及应用详解
大数据·测试工具·elasticsearch·搜索引擎·全文检索
喝醉酒的小白4 小时前
批量创建ES索引
大数据·elasticsearch·jenkins
一ge科研小菜鸡5 小时前
大数据治理实战指南:数据质量、合规与治理架构
大数据
金融OG8 小时前
99.16 金融难点通俗解释:营业总收入
大数据·数据库·python·机器学习·金融
Elastic 中国社区官方博客14 小时前
使用 Confluent Cloud 的 Elasticsearch Connector 部署 Elastic Agent
大数据·数据库·elasticsearch·搜索引擎·全文检索·confluent
快乐就好ya14 小时前
Elasticsearch+kibana安装(简单易上手)
大数据·elasticsearch·搜索引擎·全文检索