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


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




推荐阅读