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

导读:本文我们将重点介绍集群运行时中ResourceManager的设计和实现,了解如何通过ResourceManager对集群的计算资源进行有效管理 。
作者:张利兵
来源:华章科技
Flink的设计与实现:集群资源管理

文章插图
 
01 ResourceManager详解ResourceManager作为统一的集群资源管理器,用于管理整个集群的计算资源,包括CPU资源、内存资源等 。
同时,ResourceManager负责向集群资源管理器中申请容器资源启动TaskManager实例,并对TaskManager进行集中管理 。当新的作业提交到集群后,JobManager会向ResourceManager申请作业执行需要的计算资源,进而完成整个作业的运行 。
如图3-12所示,为了兼容Hadoop Yarn、Kubernetes、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服务 。
【Flink的设计与实现:集群资源管理】同时,ResourceManager实现了LeaderContender接口,可以作为竞争节点让LeaderElectionService进行Leader节点的选举,保证整个集群ResourceManager组件服务的高可用 。
从图3-12中也可以看出,ResourceManager主要包含如下成员变量 。
  • resourceId:ResourceManager对应的唯一资源ID 。
  • jobManagerRegistrations:专门存储JobManager注册信息 。其中Key为JobID;Value为JobManagerRegistration,当启动JobManager服务时,就会将JobManager信息注册在jobManagerRegistrations实例中 。
  • jmResourceIdRegistrations:用于存储JobManager注册信息,与jobManagerRegistrations的区别在于Key为ResourceID 。
  • jobLeaderIdService:用于获取Job Leader ID的服务,在开启的高可用集群中,当JobManager的Leader节点发生切换时,会借助jobLeaderIdService获取当前作业有效的JobID和地址信息 。
  • taskExecutors:注册在ResourceManager的TaskExecutor列表中,其中Key为Task-Executor对应的ResourceID,Value为WorkRegistration,即TaskExecutor向Resource-Manager注册过程中所提供的信息 。
  • taskExecutorGatewayFutures:专门存储TaskExecutorGateway的CompletableFuture对象,Key为TaskExecutor对应的ResourceID,Value为CompletableFuture,用于获取Task-ExecutorGateway,实现与TaskExecutor之间的RPC通信 。
  • highAvailabilityServices:系统高可用服务,基于highAvailabilityServices服务支持组件高可用 。
  • heartbeatServices:用于创建HeartbeatManager服务,和其他组件之间建立心跳连接 。
  • fatalErrorHandler:系统异常错误处理,当ResourceManager出现异常时调用fatal-ErrorHandler处理异常错误 。
  • slotManager:ResourceManager的内部组件,用于管理集群的可用Slot资源,同时接收并处理TaskExecutor的SlotReport 。
  • clusterInformation:存储整个Flink集群共享的信息,包括blobServerHostname和blobServerPort等配置 。
  • resourceManagerMetricGroup:ResourceManager的MetricGroup,用于收集和Resource-Manager相关的监控指标 。
  • leaderElectionService:基于ZooKeeper实现的Leader选举服务,在这里用于实现Resource-Manager组件高可用 。
  • taskManagerHeartbeatManager:管理与TaskManager之间的心跳信息 。
  • jobManagerHeartbeatManager:管理与JobManager之间的心跳信息 。
  • clearStateFuture:用于停止ResourceManager后进行数据异步清理 。
02 ResourceManagerGateway接口实现ResourceManagerGateway接口提供了ResourceManager需要的RPC方法,供其他集群组件调用 。例如在TaskExecutor中调用ResourceManagerGateway完成在ResourceManager中注册TaskExecutor的操作 。


推荐阅读