• flink集群与资源@k8s源码分析-资源I 资源请求


    1 资源

    资源分析分3部分,资源请求,资源提供,声明式资源管理,本文是第一部分资源请求

    2 场景

    资源处理有声明式处理资源细粒度处理资源 是两个实现,两者不是并行的两种实现策略,声明式是资源申请和分配方式,粒度是指资源分割方式,细粒度按需可变的资源,粗粒度是固定的资源,本文只分析声明式粗粒度处理资源

    3 申请和分配资源(simple allocator)

    用户提交作业,分发器接收并分发作业到作业管理器调度器确定所需资源,申请资源,检查当前可用资源是否足够,如果不足,请求新资源,动态增加资源;若足够,分配资源给任务。

    分配还有另一个实现,slot sharing,有比较复杂的资源分配策略,分配策略跟本文主题无关,因此选了比较简单simple allocator

    DeclarativeSlotPoolBridge桥接 声明式资源池DeclarativeSlotPool,用声明式SlotPool实现SlotPool,为了简化描述,下面描述不区分DeclarativeSlotPoolBridge和DeclarativeSlotPool

    1. 调度器调用PhysicalSlotProvider的allocatePhysicalSlot分配资源

    2. allocatePhysicalSlot首先tryAllocateFromAvailable,从当前可用资源分配;若当前可用资源不够9.3 请求新资源

    3. tryAllocateFromAvailable调用DeclarativeSlotPoolBridge的
    getAvailableSlotsInformation获取资源池的可用资源,其实际最终调用AllocatedSlotPool的getFreeSlotsInformation并组装为SlotInfoAndResources,该类组合了SlotInfo和ResourceProfile,前者是分配信息,后者是资源信息

    4. SlotSelectionStrategy选择策略在可用资源选择一个最合适的,目前基于位置策略

    5. 选出最合适的资源后,PhysicalSlotProvider调用DeclarativeSlotPoolBridge的allocateAvailableSlot分配资源,该方法不是实际分配资源,而是调用DeclarativeSlotPool的
    increaseResourceRequirementsBy增加资源请求(声明),该方法触发异步处理资源请求,3.1 notifyNewResourceRequirements深入分析

    6. 最后保留资源,真正的分配在处理资源请求,保留资源AllocatedSlotPool的reserveFreeSlot登记已分配资源AllocatedSlot

    7. 最后调整资源,保留不一定是最终分配,最终分配后调整实际资源情况

    最后分析一下
    notifyNewResourceRequirements

    3.1 notifyNewResourceRequirements


    notifyNewResourceRequirements类型Consumer,函数方法

    图1

    上图是
    notifyNewResourceRequirements设置和调用的方法,函数是怎么设置?

    图2

    图1是图2的 connect调用,设置模板S,即service属性

    设置方法是哪里调起?

    1.
    ResourceManagerLeaderListener监听资源管理器选主,获取新主节点的地址

    2.
    ResourceManagerLeaderListener通知JobMaster,调用JobMaster的


    notifyOfNewResourceManagerLeader方法

    3.
    notifyOfNewResourceManagerLeader启动rpc(重新)连接

    4. rpc连接后,触发onRegistrationSuccess事件方法,然后
    DeclarativeSlotPoolService的

    connectToResourceManager方法,而后者即图1,设置Conumer

    总结,请求新资源主要是调用资源管理器的declareRequiredResources方法,该方法用
    ResourceManagerLeaderListener和DeclareResourceRequirementServiceConnectionManager绕一下,是为了适应分布式环境下资源管理器上线下线,主节点选举后获取新主的地址,重新连接后设置ResourceManagerGateway。

    4 请求新资源(request new slots)

    请求新资源是分配资源的延申,当前没有足够的可用资源,调度器请求新的资源

    类图跟申请和分配资源基本相同,场景实现由相同的类实现

    1. 调度器在9.11 分配资源没有获得足够可用资源,

    调用SlotPool的requestNewAllocatedSlot,请求新的资源;这里的SlotPool是DeclarativeSlotPoolBridge桥接 DeclarativeSlotPool实现的SlotPool,实现声明式管理的资源池,下面不区分两者

    2. DeclarativeSlotPoolBridge调用
    increaseResourceRequirementsBy增加资源请求,触发检查资源请求,参看9.2.2.1深入分析

    5 请求新worker(require new worker)

    请求新worker是请求新资源的一部分,检查资源声明判断需要新增资源,向集群管理器请求部署新worker,触发任务管理器部署,任务管理器启动后报告新的资源。

    1. 检查资源声明请求新资源的延申,判断需要增加资源时调用requestNewWorker

    2. requestNewWorker调用ResourceManagerDriver的requestResource方法,k8s环境下,ResourceManagerDriver的实现KubernetesResourceManagerDriver,requestResource使用kubeclient向k8s集群管理发起《构建和启动任务管理器》,任务管理器启动后,《注册任务管理器/报告资源》

  • 相关阅读:
    用SPM技术固定EBS标准功能的SQL执行计划
    [C国演义] 第十三章
    0501 货仓选址 【中位数 距离和的最小值】
    Impossible WHERE noticed after reading const tables
    支持向量机--svm.SVC类
    SPL-在SpringBoot中的集成(三)
    deepTools对ChIP-seq数据可视化
    Hashmap 原理、源码、面试题(史上最全)
    docker 安装 redis、redisinsight、可视化监控ganafa+prometheus
    Python数据分析实战-实现Kruskal-Wallis H检验(附源码和实现效果)
  • 原文地址:https://blog.csdn.net/szlhj/article/details/133076354