Flink系统知识讲解之:如何识别反压的源头

Flink系统知识之:如何识别反压的源头

在这里插入图片描述

什么是反压

Ufuk Celebi 在一篇古老但仍然准确的文章中对此做了很好的解释。如果您不熟悉这个概念,强烈推荐您阅读这篇文章。如果想更深入、更低层次地了解该主题以及 Flink 网络协议栈的工作原理,这里有更高级的解释。

在更高层次上,如果Flink作业图中的某些操作符算子无法以与接收记录相同的速度处理记录,就会产生反压。这就会填满运行较慢操作符的子任务的输入缓冲区。一旦输入缓冲区满了,反压就会传播到上游子任务的输出缓冲区。一旦这些缓冲区被填满,上游子任务也会被迫降低其处理记录的速度,以匹配造成瓶颈的操作符的处理速度。反压会进一步向上传播,直至到达source操作符。

只要负载和可用资源是静态的,并且没有操作符产生短时间的数据(如窗口操作符),这些输入/输出缓冲区就只会处于两种状态之一:几乎空或几乎满。如果下游操作符或子任务能够跟上数据流入的速度,缓冲区就会是空的。否则,缓冲区就会满[1]。事实上,检查缓冲区的使用指标正是几年前 Nico Kruber 推荐的检测和分析背压方法的基础。正如我在开头提到的,Flink 现在提供了更好的工具来完成同样的工作,但在此之前,有两个问题值得一问。

为什么要关注反压

反压是机器或操作符超负荷工作的指标。反压的积累会直接影响Flink系统的端到端延迟,因为记录在队列中等待的时间会更长,然后才会被处理。其次,在反压情况下,Checkpoint对齐的时间会更长,而非对齐Checkpoint的大小会更大(阻塞在输入/输出队列的数据会更多)(有关对齐和未对齐Checkpoint的更多信息,请参阅文档)。如果你正在为checkpoint barrier的传播时间而苦恼,考虑反压的存在很可能有助于解决问题。

为了解决作业的某些性能问题,我们需要意识到反压这个问题,然后对其进行定位和分析。

为什么不该关心反压

坦率地说,您不必总是关心是否存在反压。从定义上讲,缺乏反压可能意味着您的Flink作业至少存在轻微的利用不足和超额配置。如果想尽量减少闲置资源,可能会无法避免的产生一些反向压力。这对于批处理来说尤其如此。

如何检测和追踪反压的源头

检测反压的一种方法是使用Flink提供的Metrics,但在 Flink 1.13 中,不再需要如此深入地挖掘这些指标。因为在大多数情况下,只需查看 Web UI 中的作业图即可。
在这里插入图片描述

在上面的示例图中,首先要注意的是不同的任务有不同的颜色。这些颜色代表两个因素的组合:任务的反压程度和繁忙程度。空闲的任务为蓝色,完全繁忙的任务为红色,完全反压的任务为黑色。介于两者之间的任务将是这三种颜色的组合。
有了这些知识,我们就能很容易地发现反压任务(黑色)。反压任务下游最繁忙的任务(红色)很可能就是反压的来源(瓶颈)。

如果单击某项任务并进入 "BackPressure "选项卡,就可以进一步分析每个子任务的问题,查看该任务中每个子任务的反压/闲置状态。例如,通过该选项卡可以方便地发现如果任务存在数据倾斜,而且并非所有子任务的利用率都相同的情况:
在这里插入图片描述

在上面的示例中,我们可以清楚地看到哪些子任务处于空闲状态,哪些子任务处于反压状态,而且没有一个子任务处于忙碌状态。坦率地说,这足以让我们快速了解Flink应用发生了什么。不过,还有一些细节值得解释。

这些数值表示什么?

如果你对它的工作原理感到好奇,我们可以深入了解一下。我们有三个新指标,每个子任务都会显示和计算这三个指标:

  • idleTimeMsPerSecond
  • busyTimeMsPerSecond
  • backPressuredTimeMsPerSecond

这些指标分别测量每秒内子任务空闲、忙碌或反向压力所花费的平均时间(以毫秒为单位)。除了一些舍入误差外,它们应该相互补充,加起来达到1000ms/s。从本质上讲,它们与CPU使用指标非常相似。

另一个重要细节是,它们是在短时间内(几秒钟)的平均值,并考虑了子任务线程内发生的一切:操作符、函数、定时器、检查点、记录序列化/反序列化、网络堆栈和其他 Flink 内部开销。如果 一个WindowOperator 算子忙于触发定时器并产生结果,则会被报告为繁忙或反压。在 CheckpointedFunction#snapshotState 调用中进行的昂贵计算(例如刷新内部缓冲区)也会被报告为繁忙。

但有一个局限性,即 busyTimeMsPerSecond 和 idleTimeMsPerSecond 指标对子任务执行主线程之外的独立线程中发生的任何事情都是视而不见的。不过,这只与两种情况有关:

  • 在操作符中手动生成的自定义线程(不鼓励这种做法)。
  • 实现已废弃 SourceFunction 接口的旧式数据源。此类数据源会将 NaN/N/A 报告为 busyTimeMsPerSecond 的值。

为了在 Web UI 中显示这些原始指标数据,需要汇总所有子任务的这些指标(在Job Graph中,只会显示Task)。这就是为什么Web UI会显示给定任务的所有子任务的最大值,以及为什么繁忙和反压的最大值加起来可能不是 100%。一个子任务的反压可能是 60%,而另一个子任务的繁忙可能是 60%。这可能导致一个任务既有 60% 的反压,又有 60% 的繁忙度。

负载变化

另外,由于这些指标是在几秒钟内计算得到的平均值,因此在分析具有不同负载的作业或任务时,例如包含周期性触发的WindowOperator的(子)任务,负载恒定为 50% 的子任务和每秒在完全繁忙和完全闲置之间交替的子任务都将报告相同的 busyTimeMsPerSecond 值(500ms/s)。

此外,不同的负载,尤其是类似窗口操作,会将瓶颈转移到作业图中的不同位置:
在这里插入图片描述

两项任务交替出现的瓶颈:
在这里插入图片描述

在这个特定的示例中,只要 SlidingWindowOperator 还在累积记录,它就是瓶颈。但是,一旦它开始启动窗口(每 10 秒一次),下游任务 SlidingWindowCheckMapper -> Sink:SlidingWindowCheckPrintSink 就会成为瓶颈,同时,SlidingWindowOperator 就会被反压。由于这些繁忙/反压/闲置指标是几秒钟内的平均时间,因此这一微妙变化无法立即显现。此外,Web UI每 10 秒钟才更新一次状态,这也使得发现更频繁的变化变得比较困难。

遇到反压能做什么?

总的来说,这是一个复杂的话题,值得专门撰写一篇博文。简而言之,处理反压有两种方法:要么增加更多资源(更多机器、更快的 CPU、更多内存、更好的网络、使用固态硬盘…),要么优化现有资源的使用(优化代码、调整配置、避免数据倾斜)。无论是哪种情况,首先都需要分析造成反压的原因:

  • 分析出反压的存在。
  • 确定是哪个子任务或哪台机器造成的。
  • 深入挖掘代码的哪个部分导致了问题的出现,以及哪个资源是稀缺的。

反压监控指标可以帮助您解决前两点问题。要解决最后一个问题,则需要对代码进行剖析。从 Flink 1.13 开始,Flame Graphs 集成到了 Flink 的 Web UI中,为剖析提供了帮助。Flame Graphs 是一种剖析工具和可视化技术,有兴趣的可以试一试。

但请记住,在找到瓶颈所在后,可以像分析其他非分布式应用程序一样对其进行分析(通过检查资源利用率、使用Code Profiler等)。通常情况下,解决此类问题没有灵丹妙药。您可以尝试扩大规模,但有时这样做并不容易,也不现实。

总之,上述对反压监控的改进让我们可以轻松检测到反压的来源,而 Flame Graphs 则可以帮助我们分析特定子任务导致问题的原因。这两项功能结合在一起,将使以前相当乏味的 Flink 作业调试和性能分析过程变得更加轻松!请升级到 Flink 1.13.x 并试用它们!

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Go学习:多重赋值与匿名变量

1. 变量的多重赋值 1.1 基本语法格式 go语言中,可以将多个赋值语句 合并成 一句,比如: a : 10 b : 20 c : 30//a,b,c三个变量的赋值语句可以简练成以下格式a, b, c : 10, 20, 30 1.2 交换变量值 当需要交换两个变量的值时&#…

ArkUI-应用数据持久化

应用数据持久化,是指应用将内存中的数据通过文件或数据库的形式保存到设备上。内存中的数据形态通常是任意的数据结构或数据对象,存储介质上的数据形态可能是文本、数据库、二进制文件等。 HarmonyOS标准系统支持典型的存储数据形态,包括用户…

SOLID原则学习,开闭原则

文章目录 1. 定义2. 开闭原则的详细解释3. 实现开闭原则的方法4. 总结 1. 定义 开闭原则(Open-Closed Principle,OCP)是面向对象设计中的五大原则(SOLID)之一,由Bertrand Meyer提出。开闭原则的核心思想是…

西电-算法分析-研究生课程复习笔记

24年秋的应该是张老师最后一次用卷面考试,他说以后这节课的期末考试都是在OJ上刷题了张老师上课还挺有意思的,上完之后能学会独立地思考算法设计问题了。整节课都在强调规模压缩这个概念,考试也是考个人对这些的理解,还挺好玩的哈…

插入实体自增主键太长,mybatis-plaus自增主键

1、问题 spring-boot整合mybtais执行insert语句时,主键id为长文本数据。 2、分析问题 1)数据库主键是否自增 2)数据库主键的种子值设置的多少 3、解决问题 1)数据库主键设置的时自增 3)种子值是1 所以排查是数据库的问题 4、继…

上海亚商投顾:沪指探底回升微涨 机器人概念股午后爆发

上海亚商投顾前言:无惧大盘涨跌,解密龙虎榜资金,跟踪一线游资和机构资金动向,识别短期热点和强势个股。 一.市场情绪 市场全天探底回升,沪指盘中跌超1.6%,创业板指一度跌逾3%,午后集体拉升翻红…

基于深度学习算法的AI图像视觉检测

基于人工智能和深度学习方法的现代计算机视觉技术在过去10年里取得了显著进展。如今,它被广泛用于图像分类、人脸识别、图像中物体的识别等。那么什么是深度学习?深度学习是如何应用在视觉检测上的呢? 什么是深度学习? 深度学习是…

基于Spring Boot的海滨体育馆管理系统的设计与实现

风定落花生,歌声逐流水,大家好我是风歌,混迹在java圈的辛苦码农。今天要和大家聊的是一款基于springboot的海滨体育馆管理系统的设计与实现。项目源码以及部署相关请联系风歌,文末附上联系信息 。 项目简介: 宠物医院…

深度学习每周学习总结R3(LSTM-火灾温度预测)

🍨 本文为🔗365天深度学习训练营 中的学习记录博客R4中的内容,为了便于自己整理总结起名为R3🍖 原作者:K同学啊 | 接辅导、项目定制 目录 0. 总结1. LSTM介绍LSTM的基本组成部分如何理解与应用LSTM 2. 数据导入3. 数据…

全方位解读消息队列:原理、优势、实例与实践要点

全方位解读消息队列:原理、优势、实例与实践要点 一、消息队列基础认知 在数字化转型浪潮下,分布式系统架构愈发复杂,消息队列成为其中关键一环。不妨把消息队列想象成一个超级“信息驿站”,在古代,各地的信件、物资运…

conda install包时出现CondaHTTPError: HTTP 403 FORBIDDEN for url ....问题,但已经排除镜像源问题

最近连WIFI下包出现如下问题,已排除镜像源问题。但是一直装不上包。 CondaHTTPError: HTTP 403 FORBIDDEN for url https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/main/win-64/ca-certifica Elapsed: 00:00.202308 An HTTP error occurred when trying to …

【Rust自学】11.3. 自定义错误信息

喜欢的话别忘了点赞、收藏加关注哦,对接下来的教程有兴趣的可以关注专栏。谢谢喵!(・ω・) 11.3.1. 添加错误信息 在 11.2. 断言(Assert) 中我们学习了assert!、assert_eq!和assert_ne!这三个宏,而这篇文章讲的就是它…

linux下shell中使用上下键翻出历史命名时出现^[[A^[[A^[[A^[[B^[[B的问题解决

前言 今天在使用linux的时候,使用上下键想翻出历史命令时,却出现[[A[[A[[A[[B^[[B这种东东,而tab键补全命令的功能也无法使用。最终发现是由于当前用户使用的shell是/bin/sh的原因。 解决方法 运行以下命令,将默认 shell 设置为…

【操作系统】课程 8文件管理 同步测练 章节测验

8.1知识点导图 它详细地展示了文件的定义、分类、逻辑结构、目录结构以及文件共享和保护的各个方面。下面是对图中内容的文字整理: 文件定义 文件是具有文件名的一组相关信息的集合。 文件分类 按用途分类:系统文件、用户文件、库文件。按存取控制属性分…

1月9日星期四今日早报简报微语报早读

1月9日星期四,农历腊月初十,早报#微语早读。 1、上海排查47家“俄罗斯商品馆”:个别店铺被责令停业,立案调查; 2、西藏定日县已转移受灾群众4.65万人,检测到余震646次; 3、国家发改委&#x…

1.8-9号Python猛刷动态规划

今日宽恕:总结不是纠结过去,表达不是“见斑知豹”,还要更多信息整合后去回答。 题目一 3297.统计重新排列后包含另一个字符串| 示例 1: 输入:word1 "abcabc", word2 "abc" 输出:10 解释&#…

【Python】论文长截图、页面分割、水印去除、整合PDF

有的学校的论文只能在线预览,且存在水印。为保存到本地方便查阅,可以使用以下工作流进行处理: 用浏览器打开在线论文预览界面;使用fastone capture软件截长图;将论文按页数进行分割;按照阈值消除浅色的背景…

FPGA的 基本结构(Xilinx 公司Virtex-II 系列FPGA )

以Xilinx 公司Virtex-II 系列FPGA 为例,其基本结构由下图所示。它是主要由两大部分组成:可编程输入/输出(Programmable I/Os)部分和内部可配置(Configurable Logic)部分。 可编程输入/输出(I/Os…

详解Sonar与Jenkins 的集成使用!

本文阅读前提 本文假设读者熟悉Jenkins和SonarQube的基础操作。 核心实现功能 Jenkins中运行的job来调用SonarScanner,最后可实现测试结果与SonarQube中同步查看。 Jenkins中安装Sonar相关插件 配置Sonarqube Dashboard>Manage Jenkins>Systems 指定son…

010:传统计算机视觉之大津算法初探

本文为合集收录,欢迎查看合集/专栏链接进行全部合集的系统学习。 合集完整版请参考这里。 上一节学习了利用 Canny 算法来完成一个图片的边缘检测,从而可以区分出图像的边缘。 本节再了解一个计算机视觉中更常见的应用,那就是把图片的前景和…