zoukankan      html  css  js  c++  java
  • Flink架构分析之资源分配

    Task Slot

        Flink中每个真正执行任务的TaskManager都是一个JVM进程,其在多线程环境中执行一个或者多个子任务。为了控制一个JVM同时能运行的任务数量,flink引入了task slot的概念。每一个task solt代表了TaskManager资源的一个子集,比如,一个拥有3个solt的TaskManager,每一个solt可以使用1/3TM所管理的内存。进行资源分割意味着为子任务保留足够的内存,从而避免与其他子任务进行竞争。注意:当前solt还不能分割cpu资源,仅仅对内存进行了分割。

        通过调整TMsolt的数量,用户可以确定子任务的隔离程度,比如,每个TM只设置一个solt,那么就意味着每一个任务组都在单独的JVM中执行。共用JVM的任务可以共享TCP链接,心跳消息,甚至可能共享数据集。

        默认情况下,flink允许子任务共享slot只要这些子任务属于同一job。允许solt共享主要有以下两方面的好处:

    • flink计算一个job所需solt数量时,只需要确定所其最大并行度(parallelism),而不用计算每一个任务的并行度的总和。
    • 能更好的利用资源,如果没有solt共享,那些资源需求不大的map子任务将和资源需求更大的window占用相同的资源。

        当然Flink也提供了资源分组机制相关API,允许用户避免非预期的资源共享。

    • startNewChain 从此operator开始新的资源共享链
    • disableChaining 禁止把此operator加入到资源共享链中
    • slotSharingGroup 把此operator加入到指定的资源共享组中

    资源分配逻辑

    下图是fip6对架构改进过后JobManagerTaskManager主要交互图,可见job在执行中通过SlotProvider(即Scheduler)向ResourceManager申请资源,RM协调TaskManager满足JobManager资源请求。


    下图是资源申请详细调用流程图:

    可见Execution在执行过程中,会根据是否设置资源共享组,考虑是否为多个Execution分配同一个Slot,其代码逻辑在SlotSharingManager中。资源分配的时候优先考虑SlotPool中是否有已分配资源能满足需求,如果不能再向ResourceManager申请。

    Scheduler

    • 通过allocateSlotSlotPool申请资源
    • 通过returnLogicSlot释放资源到SlotPool

    SlotPool

    与其他组件之间的交互:

    • Scheduler -> SlotPool: 调度器向SlotPool申请资源
    • SlotPool -> ResourceManager: SlotPool如果无法满足资源请求,向RM发起申请
    • JobMaster -> SlotPool: 从TaskManager获取的资源通过JobMaster分配给SlotPool

    LogicalSlot

    • SingleLogicSlot包含一个SlotContext接口对象,PhysicalSlot接口继承了SlotContext
    • 实现了PhysicalSlot.Payload接口,可以通过PhysicalSlot.tryAssignPayloadPhysicalSlot分配给LogicalSlot

    PhysicalSlot


    AllocatedSlot代表从TaskExecutor分配的资源一个资源槽,代表TaskExecutor上的一段资源。

    如下代码把PhysicalSlot分配给LogicalSlot

    Slot资源共享

    Flink实现了资源共享机制,相同资源组里的多个Execution可以共享一个Slot资源槽。具体共享机制又分两种:

    • CoLocationGroup: 保证把JobVertices的第n个运行实例和其他相同组内的JobVertices第n个实例运作在相同的slot中。
    • SlotSharingGroup: 允许不同的JobVertices的部署在相同的Slot中,但这是一种宽约束,只是尽量做到不能完全保证。

    SlotSharingManager

    每一个sharingGroup组用一个SlotSharingManager对象管理资源共享与分配。普通的slotsharing根据组内的JobVertices id 查找是否已有可以共享的Slot,如果有则直接使用,否则申请新的Slot。colocal类型根据组内每个ExecutionVertex关联的CoLocationConstraint查找是否有相同CoLocationConstraint约束已分配Slot可用(注:满足CoLocationConstraint约束的同一个资源共享组内的各节点相同序号n的并行实例,共享相同的CoLocationConstraint对象)

    其他相关类

    • CoLocationConstraint
    • SingleLogicalSlot
    • MultiTaskSlot

  • 相关阅读:
    DM数据库disql的使用 Disql disql 达梦数据库Disql
    移动端禁止蒙层下的页面滚动
    移动端如何自动适配px
    使用Vant做移动端对图片预览ImagePreview和List的理解
    uniapp中使用uView组件库
    h5使用vuephotopreview 做全屏预览
    jsonview的实现
    PC端自适应使用rem 移动端适配升级版
    axios解决跨域问题(vuecli3.0)
    vs code 配置git path
  • 原文地址:https://www.cnblogs.com/andyhe/p/10633692.html
Copyright © 2011-2022 走看看