您当前的位置:首页 > 电脑百科 > 程序开发 > 编程百科

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

时间:2021-08-23 10:54:53  来源:  作者:华章科技

导读:本文我们将重点介绍集群运行时中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服务。

同时,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的操作。

如图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调用

  • registerJobManager():在ResourceManager中注册JobManager服务,此时会在job-LeaderIdService服务中添加注册的JobManager信息。
  • requestSlot():JobManager向ResourceManager申请运行Task所需的Slot资源。
  • heartbeatFromJobManager():用于在JobManager与ResourceManager之间建立长期的心跳连接。
  • disconnectJobManager():根据JobID删除之前注册在ResourceManager中的Job-Manager信息,并且关闭JobManager与ResourceManager之间的RPC连接。

2. TaskExecutor和ResourceManager 的RPC调用

  • heartbeatFromTaskManager():在TaskExecutor中调用heartbeatFromTaskManager()方法,构建TaskExecutor与ResourceManager之间的心跳连接。
  • disconnectTaskManager():停止TaskExecutor组件时会调用disconnectTaskManager()方法断开TaskExecutor与ResourceManager之间的RPC连接。
  • registerTaskExecutor():当新的TaskExecutor启动时,会调用该方法向Resource-Manager注册TaskExecutor信息。
  • sendSlotReport():当TaskExecutor启动并注册成功后,会调用sendSlotReport()方法向ResourceManager上报SlotReport。SlotReport中包含TaskExecutor的资源数量和配置信息等内容。
  • notifySlotAvailable():当TaskExecutor中具有空闲Slot计算资源时,会调用notify-SlotAvailable()方法通知ResourceManager将该Slot资源变为Available状态。
  • cancelSlotRequest():取消JobManager已经分配的资源。

3. Dispatcher和ResourceManager的RPC调用

  • requestResourceOverview():用于在Dispatcher中获取集群资源信息,包括集群中的TaskManager、numberRegisteredSlots以及numberFreeSlots数量。
  • requestTaskManagerMetricQueryServiceAddresses():从ResourceManager获取Task-Manager的MetricQueryService路径,主要用于前端获取TaskManager的监控指标。

4. WebMonitorEndpoint和ResourceManager 的RPC调用

  • requestTaskManagerInfo():用于获取TaskManager的相关信息,即TaskExecutor启动过程中注册在ResourceManager的信息,包括TaskExecutor的网关地址、端口以及TaskExecutor的硬件信息。
  • requestTaskManagerFileUpload():请求上传文件到BlobServer上,返回Transient-BlobKey。

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资源的整个过程。

  • 启动TaskManager后,调用ResourceManagerGateway.registerTaskExecutor()方法向ResourceManager中注册TaskManager连接信息。
  • 创建TaskManager和ResourceManager之间的RPC连接,TaskManager调用Resource-ManagerGateway.sendSlotReport()方法向ResourceManager发送SlotReport信息,接着ResourceManager调用SlotManager.registerTaskManager()方法,将TaskManager的资源信息写入SlotManager。
  • 在SlotManager中根据SlotReport中的Slot信息创建TaskManagerSlot,并注册到SlotManager的HashMap<SlotID, TaskManagerSlot> slots集合中。
  • SlotManager含有HashMap<SlotID, TaskManagerSlot> slots和LinkedHashMap<SlotID, TaskManagerSlot> freeSlots两个Slot集合。前者维护所有注册到SlotManager中的Slot计算资源,后者存储当前SlotManager中可用的Slot资源。

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

  • JobManager调用ResourceManagerGateway.requestSlot()方法向ResourceManager发起Slot计算资源申请。
  • ResourceManager内部会调用SlotManager.registerSlotRequest()方法,向SlotManager申请作业需要的Slot计算资源。
  • SlotManager中维护了HashMap<AllocationID, PendingSlotRequest> pendingSlotRequests集合,将所有的PendingSlotRequest存储在该集合中,并根据SlotRequest的Resource-Profile匹配合适的Slot计算资源,然后对Slot进行分配。
  • 当SlotRequest需要的Slot计算资源分配完毕后,将已经分配的SlotID信息写入HashMap<AllocationID, SlotID> fulfilledSlotRequests集合。

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设计与实现:核心原理与源码解析》,经出版方授权发布。



Tags:Flink   点击:()  评论:()
声明:本站部分内容及图片来自互联网,转载是出于传递更多信息之目的,内容观点仅代表作者本人,如有任何标注错误或版权侵犯请与我们联系(Email:2595517585@qq.com),我们将及时更正、删除,谢谢。
▌相关推荐
导读:本文我们将重点介绍集群运行时中ResourceManager的设计和实现,了解如何通过ResourceManager对集群的计算资源进行有效管理。作者:张利兵来源:华章科技 01 ResourceManager...【详细内容】
2021-08-23  Tags: Flink  点击:(79)  评论:(0)  加入收藏
简介: 新的接入方案在接入成本、接入延迟上都有了较为明显的优化效果,减轻了对统一调度系统的负载压力,并具备了端到端的业务对账能力。在公司开源协同的大背景下,TDBank的hive...【详细内容】
2020-11-18  Tags: Flink  点击:(107)  评论:(0)  加入收藏
1、场景描述例如订单库进行了分库分表,其实例如下图所示: 现在的需求是希望创建一个任务就将数据同步到MQ集群,而不是为每一个数据库实例单独创建一个任务,将其数据导入到MQ集...【详细内容】
2020-11-16  Tags: Flink  点击:(308)  评论:(0)  加入收藏
目前在唯品会实时平台并不是一个统一的计算框架,而是包括Storm,Spark,Flink在内的三个主要计算框架,这是由于历史原因形成。实时平台的职责主要包括实时计算平台和实时基础数据...【详细内容】
2020-10-13  Tags: Flink  点击:(124)  评论:(0)  加入收藏
Flink是什么?Flink是一个框架,是一个用于有限(bounded)或者无限(unbounded)数据流上进行有状态计算的分布式处理引擎。处理框架Flink的软件栈如图一所示,其核心是distributed dataf...【详细内容】
2020-08-31  Tags: Flink  点击:(110)  评论:(0)  加入收藏
如何学习Flink?对于一门计算机技术来说,如何快速学习上手呢?具体的逻辑是什么呢?我认为有以下几条 了解技术的应用场景 技术的基本概念,如何使用,以及如何部署(针对大数据组件而...【详细内容】
2020-08-15  Tags: Flink  点击:(83)  评论:(0)  加入收藏
本文主要从以下几个方面介绍Flink的流处理API&mdash;&mdash;Source一、从集合中读取数据二、从文件中读取数据三、从Kafka中读取数据四、自定义Source数据处理的过程基本可...【详细内容】
2020-08-11  Tags: Flink  点击:(74)  评论:(0)  加入收藏
实时数仓建设目的解决传统数仓的问题实时数仓是一个很容易让人产生混淆的概念。实时数仓本身似乎和把 PPT 黑色的背景变得更白一样,从传统的经验来讲,我们认为数仓有一个很重...【详细内容】
2020-08-03  Tags: Flink  点击:(24)  评论:(0)  加入收藏
1. 目标在本教程中,我们将讨论Apache Spark和Apache Flink之间的比较。Apache spark和Apache Flink都是用于大规模批处理和流处理的开源平台,为分布式计算提供容错和数据分布...【详细内容】
2020-07-31  Tags: Flink  点击:(107)  评论:(0)  加入收藏
导读:Apache Flink 是一个分布式大数据处理引擎,可对有限数据流和无限数据流进行有状态计算。可部署在各种集群环境,对各种大小的数据规模进行快速计算。滴滴基于 Apac...【详细内容】
2020-05-04  Tags: Flink  点击:(84)  评论:(0)  加入收藏
▌简易百科推荐
摘 要 (OF作品展示)OF之前介绍了用python实现数据可视化、数据分析及一些小项目,但基本都是后端的知识。想要做一个好看的可视化大屏,我们还要学一些前端的知识(vue),网上有很多比...【详细内容】
2021-12-27  项目与数据管理    Tags:Vue   点击:(1)  评论:(0)  加入收藏
程序是如何被执行的&emsp;&emsp;程序是如何被执行的?许多开发者可能也没法回答这个问题,大多数人更注重的是如何编写程序,却不会太注意编写好的程序是如何被运行,这并不是一个好...【详细内容】
2021-12-23  IT学习日记    Tags:程序   点击:(9)  评论:(0)  加入收藏
阅读收获✔️1. 了解单点登录实现原理✔️2. 掌握快速使用xxl-sso接入单点登录功能一、早期的多系统登录解决方案 单系统登录解决方案的核心是cookie,cookie携带会话id在浏览器...【详细内容】
2021-12-23  程序yuan    Tags:单点登录(   点击:(8)  评论:(0)  加入收藏
下载Eclipse RCP IDE如果你电脑上还没有安装Eclipse,那么请到这里下载对应版本的软件进行安装。具体的安装步骤就不在这赘述了。创建第一个标准Eclipse RCP应用(总共分为六步)1...【详细内容】
2021-12-22  阿福ChrisYuan    Tags:RCP应用   点击:(7)  评论:(0)  加入收藏
今天想简单聊一聊 Token 的 Value Capture,就是币的价值问题。首先说明啊,这个话题包含的内容非常之光,Token 的经济学设计也可以包含诸多问题,所以几乎不可能把这个问题说的清...【详细内容】
2021-12-21  唐少华TSH    Tags:Token   点击:(9)  评论:(0)  加入收藏
实现效果:假如有10条数据,分组展示,默认在当前页面展示4个,点击换一批,从第5个开始继续展示,到最后一组,再重新返回到第一组 data() { return { qList: [], //处理后...【详细内容】
2021-12-17  Mason程    Tags:VUE   点击:(14)  评论:(0)  加入收藏
什么是性能调优?(what) 为什么需要性能调优?(why) 什么时候需要性能调优?(when) 什么地方需要性能调优?(where) 什么时候来进行性能调优?(who) 怎么样进行性能调优?(How) 硬件配...【详细内容】
2021-12-16  软件测试小p    Tags:性能调优   点击:(19)  评论:(0)  加入收藏
Tasker 是一款适用于 Android 设备的高级自动化应用,它可以通过脚本让重复性的操作自动运行,提高效率。 不知道从哪里听说的抖音 app 会导致 OLED 屏幕烧屏。于是就现学现卖,自...【详细内容】
2021-12-15  ITBang    Tags:抖音防烧屏   点击:(23)  评论:(0)  加入收藏
11 月 23 日,Rust Moderation Team(审核团队)在 GitHub 上发布了辞职公告,即刻生效。根据公告,审核团队集体辞职是为了抗议 Rust 核心团队(Core team)在执行社区行为准则和标准上...【详细内容】
2021-12-15  InfoQ    Tags:Rust   点击:(24)  评论:(0)  加入收藏
一个项目的大部分API,测试用例在参数和参数值等信息会有很多相似的地方。我们可以复制API,复制用例来快速生成,然后做细微调整既可以满足我们的测试需求1.复制API:在菜单发布单...【详细内容】
2021-12-14  AutoMeter    Tags:AutoMeter   点击:(20)  评论:(0)  加入收藏
最新更新
栏目热门
栏目头条