<返回更多

Flink的设计与实现:集群资源管理

2021-08-23    华章科技
加入收藏

导读:本文我们将重点介绍集群运行时中ResourceManager的设计和实现,了解如何通过ResourceManager对集群的计算资源进行有效管理。

作者:张利兵

来源:华章科技

Flink的设计与实现:集群资源管理

 

01 ResourceManager详解

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

同时,ResourceManager负责向集群资源管理器中申请容器资源启动TaskManager实例,并对TaskManager进行集中管理。当新的作业提交到集群后,JobManager会向ResourceManager申请作业执行需要的计算资源,进而完成整个作业的运行。

如图3-12所示,为了兼容Hadoop Yarn、Kube.NETes、Mesos等集群资源管理器,在ResourceManager抽象实现类的基础上,分别实现了ActiveResourceManager、
Standalone-ResourceManager以及MesosResourceManager等子类。

其中ActiveResourceManager实现了动态资源管理,可以根据提交的作业动态选择启动或停止TaskManager实例。目前支持TaskManager动态管理和启动的ResourceManager主要有KubernetesResourceManager和Yarn-ResourceManager实现类。

Flink的设计与实现:集群资源管理

▲图3-12 ResourceManager UML关系图

从图3-12中可以看出,ResourceManager通过实现ResourceManagerGateway接口,向其他组件提供RPC远程访问能力,如TaskManager服务和JobManager服务的Resource-ManagerGateway会将RPC访问请求发送到ResourceManager服务中。

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

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

从图3-12中也可以看出,ResourceManager主要包含如下成员变量。

02 ResourceManagerGateway接口实现

ResourceManagerGateway接口提供了ResourceManager需要的RPC方法,供其他集群组件调用。例如在TaskExecutor中调用ResourceManagerGateway完成在ResourceManager中注册TaskExecutor的操作。

如图3-13所示,通过对ResourceManagerGateway中提供的RPC方法进行梳理,得到JobManager、TaskExecutor、WebMonitorEndpoint和Dispatcher等组件与ResourceManager-Gateway之间的RPC调用关系图。

Flink的设计与实现:集群资源管理

▲图3-13 ResourceManager调用关系图

从图3-13中可以看出,JobManager、TaskExecutor、WebMonitorEndpoint和Dispatcher组件分别使用如下方法与ResourceManager服务进行交互。

1. JobManager和ResourceManager 的RPC调用

2. TaskExecutor和ResourceManager 的RPC调用

3. Dispatcher和ResourceManager的RPC调用

4. WebMonitorEndpoint和ResourceManager 的RPC调用

03 Slot计算资源管理

如图3-14所示,ResourceManager内部主要通过SlotManager服务统一对整个集群的Slot计算资源进行管理。Slot被称为资源卡槽,用于表示可以分配的最小计算资源单位,提交的Task最终会运行在Slot表示的计算资源中。

Flink的设计与实现:集群资源管理

▲图3-14 Slot计算资源管理

从图3-14中可以看出,ResourceManager包含了Register Slot和Free Slot两个键值对集合。其中Register Slot专门存储ResourceManager中所有已经注册的TaskManagerSlot信息,Free Slot集合则存储了当前SlotManager中处于空闲状态且还没有被分配和使用的Slot集合。

TaskManagerSlot对象包含了SlotID、ResourceProfile以及TaskExecutorConnection等信息。如果Slot被分配使用,在TaskManagerSlot中还会存储AllocationID和JobID等分配信息,表明当前Slot已经被指定JobID对应的JobManager使用。

另外,SlotManager还包含了pendingSlotRequests和fulfilledSlotRequests两个键值对集合。其中pendingSlotRequests存储了所有处于pending和unfulfilled状态的Slot请求,fulfilledSlotRequests存储了所有已经分配完成的Slot请求。

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

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

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

在SlotManager中完成Slot资源注册后,等待集群提交和运行作业。JobManager通过调用ResourceManagerGateway中的相关方法为作业申请Slot计算资源,整个申请过程如下。

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

以上就是在ResourceManager中注册和分配Slot计算资源的全部过程,本文篇幅有限,Slot注册和分配过程中涉及的核心代码的详细介绍,请见《Flink设计与实现:核心原理与源码解析》第3.3.3节。

关于作者:张利兵,资深大数据专家和架构师,现任第四范式AI数据平台架构师,曾就职于明略数据。Apache Flink的贡献者,对Flink有非常深入的研究。长期从事大数据架构落地以及机器学习平台与数据平台研发架构工作,在Hadoop、Spark、机器学习等方面积累了丰富的经验。先后参与和主导了银行、证券、地铁等领域的大数据平台的架构设计与实现。《Flink原理、实战与性能优化》作者,极客时间《Flink原理与实战》专栏作者。

本书摘编自《Flink设计与实现:核心原理与源码解析》,经出版方授权发布。

声明:本站部分内容来自互联网,如有版权侵犯或其他问题请与我们联系,我们将立即删除或处理。
▍相关推荐
更多资讯 >>>