Flink 资源管理

文章目录

  • 前言
  • ResourceManager详解
  • Slot 管理器
  • SlotProvider
  • Slot资源池
  • Slot共享
    • Slot共享的优点
    • Slot 共享组与 Slot 共享管理器
    • Slot资源申请
  • 总结


前言

在Flink中,资源管理是一个核心组件,它负责分配和管理计算资源,以确保任务能够高效、稳定地运行。以下是关于Flink资源管理的详细解释:

  1. 资源管理的目标

    • 高效性:确保任务能够充分利用可用的计算资源,达到最佳的处理性能。
    • 稳定性:在资源不足或任务失败时,能够优雅地处理并恢复任务,保持系统的稳定运行。
  2. 资源管理的组件

    • Flink Cluster:由Flink Master(也称为JobManager)和多个Task Managers组成。Master负责整个集群的协调和资源分配,而Task Managers负责执行具体的任务。
    • ResourceManager:位于Flink Master中,负责整个集群的资源调度以及与外部调度系统(如YARN、Kubernetes等)的对接。
    • JobManager:每个JobManager负责管理一个具体的作业(Job)。它包含一个Scheduler组件,负责调度执行该Job的DAG(有向无环图)中所有Task,并发出资源请求。
    • TaskManager:负责执行具体的Task,并持有Slot资源。Slot是Flink中最小的资源分配单位,一个TaskManager可以有多个Slot。
  3. 资源抽象

    • 集群资源:由资源管理框架(如YARN、Kubernetes等)管理,包括CPU、内存、GPU等硬件资源。Flink从资源管理框架中申请和释放这些资源。
    • Flink自身资源:Flink对申请到的资源进行切分,每一份称为TaskSlot。Slot是Flink内部对资源的抽象,用于隔离不同作业的任务。
  4. 资源申请与释放

    • Flink从资源管理框架申请资源容器(如YARN中的Container或Kubernetes中的Pod),每个容器中运行一个TaskManager进程。
    • TaskManager中的每个Slot可以运行一个Task。因为计算类型的不同,一个Task可能无法充分利用一个Slot的资源,所以单个Slot可以被多个Flink的任务共享。
  5. 资源调度策略

    • Flink提供了多种资源调度策略,如基于优先级的调度、公平调度等,以满足不同作业的资源需求。
  6. 容错与恢复

    • 当TaskManager或JobManager失败时,Flink能够自动检测并触发相应的恢复机制,确保作业的持续运行。
  7. 与外部系统的集成

    • Flink可以与多种资源管理框架(如YARN、Kubernetes、Mesos等)集成,实现资源的动态申请与释放。

综上所述,Flink的资源管理是一个复杂而关键的过程,它涉及到集群资源的申请与释放、资源的抽象与切分、资源调度策略以及容错与恢复等多个方面。通过有效的资源管理,Flink能够确保作业的高效、稳定运行。


ResourceManager详解

ResourceManager 作为统一的集群资源管理器,用于管理整个集群的计算资源,包括 CPU资源、内存资源等。同时ResourceManager 负责向集群资源管理器申请容器资源启动TaskManager实例,并对TaskManager进行集中管理。 当新的 Job 提交到集群后,JobManager 会向 ResourceManager 申请作业执行需要的计算资源,进而完成整个作业的运行。
在 FlinK 中内置了 4 种 ResourceManager,即 YarnResourceManager、KubernetesResourceManager(K8s)、StandaloneResourceManager、 MesosResourceManager,分别对应于不同的资源管理框架。

Slot 管理器

Slot 管理器在 Flink 中叫作 SlotManager,是 ResourceManager 的组件,从全局角度维护当前有多少个 TaskManager,每个 TaskManager 有多少个空闲的 Slot 和 Slot 等资源的使用情况。当 Flink 作业调度执行时,根据 Slot 分配策略为 Task 分配执行位置。

SlotManager 虽然是 ResourceManager 的组件,但是其逻辑是通用的,并不关心到底使用了哪种资源集群。面向不同的对象,SlotManager 提供不同的功能:

1)对 TaskManager 提供注册、取消注册、空闲退出等管理动作,注册则集群可用的 Slot 变多,取消注册、空闲推出则释放资源,还给资源管理集群。
2)对 Flink 作业,接受 Slot 的请求和释放、资源汇报等。当资源不足的时候,SlotManager 将资源请求暂存在等待队列中,SlotManager 通知 ResourceManager 去申请更多的资源,启动新的 TaskManager,TaskManager 注册到 SlotManager 之后,SlotManager 就有可用的新资源了,从等待队列依次分配资源。

SlotProvider

SlotProvider接口定义了Slot的请求行为,支持两种请求模式。

  • 立即响应模式:Slot请求会立即执行。
  • 排队模式:排队等待可用的Slot,当资源可用时分配资源。

最终的实现在SchedulerImpl中,其中Scheduler接口增加了SlotSelectionStratety。

Slot资源池

Slot资源池在Flink中叫做SlotPool,是JobMaster中记录当前作业从TaskManager获取的Slot的集合。JobMaster的调度器首先从SlotPool中获取Slot来调度任务,SlotPool在没有足够的Slot资源执行作业的时候,首先尝试从ResourceManager中获取资源,如果ResourceManager当前不可用,ResourceManager拒绝资源请求或者请求超时,资源申请失败,则资源启动失败。

JobMaster申请到资源后,会在本地持有Slot,避免ResourceManager异常导致作业运行失败。对于批处理而言,持有资源JobMaster首先可以避免多次向JobMaster申请资源,同时ResourceManager不可用也不会影响作业的正常执行,只有资源不足时,才会导致作业执行失败。

当作业执行完毕或者作业完全启动且资源有剩余时,JobMaster会将剩余的资源交给ResourceManager。

Slot共享

每个TaskManager都是一个Java进程,TaskManager为Task分配独立的执行线程,一个TaskManager中可能执行一个或多个Task。TaskManager通过Slot来控制(一个TaskManager至少有一个Slot)TaskManager能接收多少个Task。

Slot表示TaskManager拥有资源的一个固定大小的子集。假如一个TaskManager有3个Slot,那么它会将其管理的内存分成3份给Slot,在没有Slot共享的情况下,并行度为2的作业部署之后,Slot与Task的分配关系如下图所示。Slot的资源化意味着一个作业的Task将不需要跟来自其他作业的Task竞争内存、CPU等计算资源。
通过调整Slot数量,用户可以定义Task之间如何隔离。如果一个TaskManager只有一个Slot,意味着每个Task独立地运行在JVM进程中。而一个TaskManager有多个Slot,则意味着更多的Task可以共享一个JVM。在同一个JVM进程中的Task将共享TCP连接和心跳消息。Task之间也可能会共享数据集和数据结构,这样可减少每个Task的负载。

虽然通过Slot对TaskManager的资源进行划分,在一定程度上能都提高集群资源的利用率,但这种做法并没有考虑到不同Task的计算任务对资源需求的差异,有时候还会是多种资源混合类型。

所以在Slot的基础上,Flink设计了Slot共享机制。其中,SlotSharingManager用在Flink作业的执行调度中,负责Slot的共享,不同的Task可以共享Slot。

Slot共享的优点

默认情况下,Flink作业共享同一个SlotSharingGroup,同一个作业中来自不同的JobVertex的Task可以共享作业。使用Slot共享,可以在一个Slot中运行Task组成的流水线。共享Slot带来如下优点。

  • 资源分配简单
    Flink集群需要的Slot数量和作业中的最高并行度一致,不需要计算一个程序总共包含多少个Task。
  • 资源利用率高
    如果没有Slot共享,资源密集型的Task(如长周期的窗口计算)跟非密集型的作业(如Source/Map)占用相同的资源,在整个TaskManager层面上,资源没有充分利用。如果共享Slot,将并行度从2提高至6,可以充分利用Slot资源,同时确保资源密集型的Task在TaskManager中公平分配。

Slot 共享组与 Slot 共享管理器

Slot共享管理器在Flink中叫作SlotSharingManager,Slot共享组在Flink中叫作SlotSharingGroup。SlotSharingManager对象管理资源共享与分配,1个Slot共享组对应1个Slot共享管理器。两者在作业调度执行的时候发挥作用,部署Task之前,选择Slot确定Task发布到哪个TaskManager。

Flink有两种共享组:

  • SlotSharingGroup
    非强制性共享约束,Slot共享根据组内的JobVertices ID查找是否已有可以共享的Slot,只要确保相同的JobVertex ID不能出现在一个共享的Slot内即可。
    在符合资源要求的Slot中,找到没有相同JobVertex ID的Slot,根据Slot选择策略选择一个Slot即可,如果没有符合条件的Slot,则申请新的Slot。
  • CoLocationGroup
    CoLocationGroup又叫作本地约束共享组,具有强制性的Slot共享限制,CoLocationGroup用在迭代运算中,即在IterativeStream的API中调用。迭代运算中的Task必须共享同一个TaskManager的Slot。CoLocationGroup可以看成是SlotSharingGroup的特例。
    此处需要注意,JobGraph向ExecutionGraph的转换过程中,为每一个ExecutionGraph Vertex赋予了按照并行度编写的编号,相同编号的迭代计算Execuetion Vertex会被放入本地共享约束组中,共享相同的CoLocationConstraint对象,在调度的时候,根据编号就能找到其他Task的Slot信息。
    CoLocation共享根据组内每个ExecutionVcrtex关联的CoLocationConsmt查找是否有相CoLocaLionConstraint约束已分配到Slot可用,在调度作业执行的时候,首先要找到本约束中其他Task部署的TaskManager,如果没有则申请一个新的Slot,如果有则共享该TaskManager上的Slot。

Slot资源申请

  • 单独Slot资源申请
    该类的Slot申请首先会从JobMaster的当前SlotPool中尝试获取资源,如果资源不足,则从SlotPool中申请新的Slot,然后SlotPool向ResourceManager请求新的Slot。
  • 共享Slot资源申请
    共享Slot在申请的时候,需要向SlotSharingManager请求资源,如果有CoLocation限制,则申请CoLocation MultiTaskSlot,否则申请一般的MultiTaskSlot。

SingleTaskSlot表示运行单个Task的Slot,每个SingleTaskSlot对应于一个LogicalSlot。MultiTaskSlot中包含一组TaskSlot。

借助SingleTaskSlot和MultiTaskSlot,Flink实现了一般Slot共享和CoLocaitonGroup共享,两者的数据结构如下图所示:

总结

总的来说,Flink资源管理是一个复杂而精细的过程,它涉及到集群资源的申请与释放、资源的抽象与切分、资源调度策略以及容错与恢复等多个方面。通过有效的资源管理,Flink能够确保作业的高效、稳定运行,为大规模数据处理提供了强有力的支持。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/733155.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Python使用Beautiful Soup及解析html获取元素并提取内容值

Python使用Beautiful Soup及解析html获取元素并提取内容值 1. 包括解析获取标题2. 根据标签及id获取所有元素3. 根据标签及class获取所有元素4. 获取元素下的标签的值5. 获取元素下的parent及child的元素的值参考 1. 包括解析获取标题 2. 根据标签及id获取所有元素 3. 根据标…

QGridLayout网格布局和QVBoxLayout垂直布局有着非常大的差别

QGridLayout网格布局:1.把这块控件划分成一个个的 单元格 2.把你的控件填充进入 单元格 3.这些有关限制大小的函数接口统统失效 setMaximumWidth() setMinimumWidth() setPolicySize()图示:我是用的网格布局,左边放QT…

C# WinForm AndtUI第三方库 Table控件使用记录

环境搭建 1.在NuGet中搜索AndtUI并下载至C# .NetFramework WinForm项目。 2.添加Table控件至窗体。 使用方法集合 1.单元格点击事件 获取被点击记录特定列内容 private void dgv_CellClick(object sender, MouseEventArgs args, object record, int rowIndex, int columnIn…

观察者模式:Java 中的一对多依赖关系解决方案

观察者模式是一种行为设计模式,用于定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都会得到通知并自动更新。这种模式通常用于解耦发布者和订阅者,使得系统更易于扩展和维护。 使用条件 观察…

【Python】装饰器函数

专栏文章索引:Python 原文章:装饰器函数基础_装饰函数-CSDN博客 目录 1. 学习装饰器的基础 2.最简单的装饰器 3.闭包函数装饰器 4.装饰器将传入的函数中的值大写 5. 装饰器的好处 6. 多个装饰器的执行顺序 7. 装饰器传递参数 8. 结语 1. 学习装饰…

C/C++蓝桥杯之整除序列

问题描述:有一个序列,序列的第一个数是n,后面的每个数均是前一个数整除2的结果,请输出这个序列中值为正数的所有项。 输入格式:输入一行,包含一个整数n。 输出格式:输出一行,包含多…

利用IDEA创建Java项目使用Servlet工具

【文件】-【项目结构】 【模块】-【依赖】-【】-【JAR】 找到Tomcat的安装路径打开【lib】找到【servlet.jar】点击【确定】 勾选上jar,然后【应用】-【确定】 此时新建文件可以发现多了一个Servlet,我们点击会自动创建一个继承好的Servlet类

计算机等级考试:信息安全技术 知识点三

1、拨号用户远程认证服务(Remote Authentication Dial-In User System,RADIUS)是一个网络协议,提供集中式AAA管理 2、在Windows NT里,口令字密文保存在SAM文件。 3、tracert是操作系统提供的命令。 4、Rootkit是一种内核隐藏技术&#xff…

STL容器之哈希的补充——其他哈希问题

1.其他哈希问题 ​ 减少了空间的消耗; 1.1位图 ​ 位图判断在不在的时间复杂度是O(1),速度特别快; ​ 使用哈希函数直接定址法,1对1映射; ​ 对于海量的数据判断在不在的问题,使用之前的一些结构已经无法满足&…

基于PSO粒子群算法的三角形采集堆轨道优化matlab仿真

目录 1.程序功能描述 2.测试软件版本以及运行结果展示 3.核心程序 4.本算法原理 5.完整程序 1.程序功能描述 假设一个收集轨道,上面有5个采集堆,这5个采集堆分别被看作一个4*20的矩阵(下面只有4*10),每个模块&…

【python3】多进程Pipe实现数据流模型

当涉及到数据流模型时,常见的方法是使用管道(Pipe)来实现进程间的通信。在数据流模型中,计算过程表示为数据流图,数据从一个节点流向另一个节点,并在节点之间进行转换和处理。 以下是一个稍微复杂一些的数…

opencv编程

opencv编程 引言: ​ 本实验旨在介绍使用OpenCV进行图像处理和视频处理的基本操作。OpenCV(Open Source Computer Vision Library)是一个开源计算机视觉库,提供了丰富的图像和视频处理功能,既可以进行图像的读取、显示…

187基于matlab的弹道目标跟踪滤波方法

基于matlab的弹道目标跟踪滤波方法,扩展卡尔曼滤波(extended Kalman filter, EKF)、转换测量卡尔曼滤波(conversion measurement Kalman filter, CMKF)跟踪滤波,得到距离、方位角、俯仰角误差结果。程序已调…

llama2c(3)之tokenizer和encode

2、tokenizer和编码 2.1 tokenizer tokenizer的model不同于Transformer的model,Transformer的model是一些权重参数,tokenizer的model是一些分词,将一个句子分成分词的中介(模型)。,具体就是tokenizer.py文…

c 不同类型指针的转换

int 指针与unsigned char类型指针互转 #include <stdio.h> #include <stdlib.h>int main(void){int a(0x1<<24)|(0x2<<16)|(0x3<<8)|0x4; //0x1020304printf("16进制:%x\n",a);u_int8_t *p(u_int8_t *)&a; //int指针转为unsig…

人工智能|机器学习——DBSCAN聚类算法(密度聚类)

1.算法简介 DBSCAN(Density-Based Spatial Clustering of Applications with Noise)是一种基于密度的聚类算法&#xff0c;簇集的划定完全由样本的聚集程度决定。聚集程度不足以构成簇落的那些样本视为噪声点&#xff0c;因此DBSCAN聚类的方式也可以用于异常点的检测。 2.算法原…

Spring AOP基于注解方式实现

1. 场景介绍 目前假设我们有一个计算器类&#xff0c;并要为其中的方法添加日志功能。 计算器类如代码所示&#xff1a; public interface Calculator {int add(int i, int j);int sub(int i, int j);int mul(int i, int j);int div(int i, int j);}public class Calculator…

《汇编语言》- 读书笔记 - 第17章-实验17 编写包含多个功能子程序的中断例程

《汇编语言》- 读书笔记 - 第17章-实验17 编写包含多个功能子程序的中断例程 逻辑扇区根据逻辑扇区号算出物理编号中断例程&#xff1a;通过逻辑扇区号对软盘进行读写 代码安装 int 7ch 测试程序效果 实现通过逻辑扇区号对软盘进行读写 逻辑扇区 计算公式: 逻辑扇区号 (面号*8…

从零开始学HCIA之IPv6基础06

1、OSPFv3是IPv6路由基础&#xff0c;OSPFv3是运行于IPv6的OSPF路由协议&#xff0c;是一个独立的路由协议。 2、OSPFv3报文类型和作用 &#xff08;1&#xff09;Hello报文&#xff0c;周期性发送&#xff0c;用来发现和维持OSPFv3邻居关系。 &#xff08;2&#xff09;DBD…

CSS基础知识

font-family: "Trebuchet MS", Verdana, sans-serif; 字体栈&#xff0c;浏览器会一个一个试过去看下哪个可以用 font-size16px; font-size1em; font-size100%;//相对于16px 字体大小&#xff0c;需要进行单位换算16px1em font-weightnormal;//400font-weight属性…