评论

收藏

[python] Flink资源管理机制

编程语言 编程语言 发布于:2021-12-31 15:47 | 阅读数:285 | 评论:0

一、基本概念
1.1 相关组件
Flink资源管理相关的组件:





  • 一个Flink Cluster是由一个Flink Master 和多个Task Manager 组成的
  • Master和TaskManager 是进程级组件



其他的组件都是进程内的组件
DSC0000.png

如图:





  • 一个flink master中有一个 Resource Manager 和多个Job Manager
  • Flink Master中每一个 Job Manager 单独管理一个具体的Job
  • Job Manager中的Scheduler 组件负责调度执行该 Job 的 DAG 中所有Task发出资源请求,即整个资源调度的起点
  • Job Manager 中的slot Pool 组件持有分配到该Job 的所有资源
  • 另外,Flink Master中唯一的Resource Manager负责整个 Flink Cluster的资源调度以及与外部调度系统对接(外部系统:Kubernetes、Mesos、Yarn等资源管理系统)



Task Manager 负责Task的执行,其中 Slot是 Task Manager资源的一个子集,也是Flink资源管理的基本单位
Slot的概念贯穿资源调度过程的始终
1.2 逻辑层级
组件之间的逻辑关系,公分为4层





  • Operator


    • 算子是最基本的数据处理单元




  • Task






    • Flink Runtime 中真正去进行调度的最小单位
    • 由一系列算子链组成(chained operators)







如果两个Operator属于同一个Task,那么不会出现一个Operator已经开始运行另一个Operator还没被调度的情况





  • Job


    • 对应一个Job Graph




  • Cluster


    • 1 Flink Master + N Task Managers




DSC0001.png

资源调度的范畴,实际上是红框内的内容。





  • JobManager、Secheduler 和 Slot Pool 对应于 Job
  • Resource Manager、Slot Manager 和 Task Manager 对应于 Flink Cluster 级别



  • 在Operator和Task中间的Chaining是指如何用Operator组成Task。
  • 在Task和Job之间的Slot Sharing 是指多个Task如果共享一个Slot资源,这种情况不会发生在跨作业的情况中
  • Flink Cluster 和 job之间的 Slot Allocation 是指Flink Cluster中的slot是怎样分配给不同的job



1.3 两层资源调度模型
Flink 资源调度室一个经典的两层模型,





  • 其中从Cluster到Job的分配过程是由Slot Manager来完成
  • Job内部分配给Task资源的过程是由Scheduler来完成



如图:Scheduler向 slot pool发出slot Request(资源请求),Slot Pool如果不能满足该资源需求则会进一步请求Resource Manager,具体来满足该请求的组件是Slot Manager
DSC0002.png

Task对slot进行复用有两种方式:





  • Slot Caching






    • 批处理
    • 流处理的 Failover
    • 多个task先后/轮流使用slot资源




  • Slot Sharing


    • 多个Task在满足一定条件下同时共享同一个Slot资源





二、当前机制与策略
2.1 TaskManager有哪些资源
DSC0003.png TaskManager资源组成






  • 资源类型






    • GPU(FLIP-108,在Flink1.11版本完成)
    • 内存
    • CPU
    • 其他扩展资源




  • Task Manager资源由配置决定






    • Standalone部署模式下,TM资源可能不同
    • 其他部署模式下,所有TM资源均相同







2.2 Slot 有哪些资源
DSC0004.png Slot资源组成

Task Manager中有固定数量的slot,slot的具体数量由配置决定,同一taskManager上slot之间没有差别,每一个slot都一样大,即资源一样多
2.3 Flink Cluster 有多少 Task Manager

  • Standalone 部署模式
在Standalone部署模式下,Task Manager的数量是固定的,如果start-Cluster.sh 脚本来启动集群,可以哦谈过修改以下文件中的配置来决定TM的数量,也可以通过手动执行taskmanager.sh脚本来启动一个TM。​​<FLINK_DIR>/conf/slaves​​





  • Active Resource manager 部署模式






    • 当前slot数量补鞥呢满足新的slot Request时,申请并开启新的Task manager
    • TaskManager空闲一段时间后,超时则释放
    • Kubernetes,Yarn,Mesos
    • 由SlotManager/ResourceManager按需动态决定







On-Yarn部署模式不再支持指定固定数量的TM,即以下命令参数已经失效
yarn-session.sh -n <num>

flink run -yn <num>
2.4 Cluster -> Job资源调度的过程
DSC0005.png Cluster到job的资源调度过程

Cluster到Job的资源调度过程中主要包括两个过程。

  • Slot Allocation(红箭头)
Scheduler向 Slot Pool发送请求,如果slot资源足够则直接分配,如果slot资源不够,则由slot pool再向Slot Manager发送请求(此时即为Job向Cluster 请求资源),如果slot Manager判断集群当中有足够的资源可以满足需求,那么就会向Task Manager 发送 Assign指令,Task Manager就会提供SLot 给Slot Pool,Slot Pool再去满足Scheduler 的资源请求

  • Starting TaskManagers(蓝箭头)
在 Active Resource Manager 资源部署模式下,当 Resource Manager 判定 Flink Cluster 中没有足够的资源去满足需求时,它会进一步去底层的资源调度系统请求资源,由调度系统把新的 Task Manager 启动起来,并且 TaskManager 向 Resource Manager 注册,则完成了新 Slot 的补充
2.5 Job -> Task 资源调度的过程





  • Scheduler






    • 根据 Execution Graph 和Task的执行状态,决定接下来要调度的Task
    • 发起SlotRequest
    • 决定Task/slot之间的分配







  • Slot Sharing






    • 运行一个作业所需的slot数量为最大并发数
    • 相对负载均衡
    • 默认所有节点在一个 Slot Sharing Group中
    • 一个Slot中相同任务只能有一个
    • Slot Sharing Group 中的任务可共用Slot
    • 优点







DSC0006.png Job到Task资源调度过程

Slot Sharing 过程如图7所示(每一行分别是一个 task 的多个并发,自下而上分别是 A、B、C),A、B、C 的并行度分别是4、4、3,这些 Task 属于同一个 Slot Sharing Group 中,所以不同的 Task 可以放在相同的 Slot 中运行,如图7右侧所示,有3个 Slot 放入了 ABC,而第四个 Slot 放入了 AB 。通过以上过程我们可以很容易推算出这个 Job 需要的 Slot 数是4,也是最大并发数
2.6  资源调优
通过以上介绍的机制,我们容易发现,Flink 所采用的是自顶向下的资源管理,我们所配置的是 Job 整体的资源,而 Flink 通过 Slot Sharing 机制控制 Slot 的数量和负载均衡,通过调整 Task Manager / Slot 的资源,以适应一个 Slot Sharing Group 的资源需求。Flink 的资源管理配置简单,易用性强,适合拓扑结构简单或规模较小的作业。




关注下面的标签,发现更多相似文章