Flink反压利用了网络传输和动态限流。Flink的任务的组成由流和算子组成,那么流中的数据在算子之间转换的时候,会放入分布式的阻塞队列中。当消费者的阻塞队列满的时候,则会降低生产者的处理速度。

如上图所示,当Task C 的数据处理速度发生异常的时候,Receive Buffer会呈现出队列满的情况,Task B发送端就会感知到这一点,因为发不过去了吗。然后把数据的发送速度降低,以此类推,整个反压会一直从下到上传递到Source端;反之,当task处理能力有提升后,会在此反馈到Source Task,数据发送和读取的速率就会升高,提高了整个flink任务的处理能力以及容错能力。
当任务出现反压时,如果你的上游是类似kafka的消息系统,很明显的表现就是消费速度过慢,kafka消费出现积压。如果业务对数据延迟要求不搞,那么反压其实没有很大的影响。但是对于规模很大的集群中的大作业,反而反压会造成很严重的问题。首先状态会变大,因为数据大规模堆积在系统中,这些暂时不被处理的数据,同样会被放到状态中。另外,Flink会因为数据堆积和处理速度变慢导致Checkpoint超时。Checkpoint超时的话,checkpoint是我们数据一致性的关键所在,如果一直checkpoint超时,会导致kafka lag一直居高不下,一直失败,一直失败,导致状态变大。有可能造成OOM导致JOB失败。此时重新消费数据有可能会出现重复消费数据的可能,严重的会导致数据不一致的产生。

那么我们如何判断是否反压呢,我们可以在flink任务的后台页面进行查看
在默认的设置下,Flink的TaskManager会每隔50ms触发一次反压状态检测,共检测100次,并将结果反馈给JobManager,最后由JobManager进行计算反压的比例,然后进行展示。
这个比例展示逻辑如下:
OK:0 <= Ratio <= 0.10,正常
LOW:0.10 < Ratio <= 0.50,一般
HIGH:0.5 < Ratio <= 1,严重

要解决反压首先要做的是定位到造成反压的节点,这主要有两种办法:

  1. 通过 Flink Web UI 自带的反压监控面板
  2. 通过 Flink Task Metrics
    前者比较容易上手,适合简单分析,后者则提供了更加丰富的信息,适合用于监控系统。因为反压会向上游传到,这两种方式都要求我们从Source节点到Sink的逐一排查。
    如果出于反压状态,那么有两种可能性:
  3. 该节点的发送速率跟不上它产生数据的速率
  4. 下游的节点接速率较慢,通过反压机制限制了该节点的发送速率
    如果是第一种状况,那么该节点则为反压的根源节点,它是从Source Task到SInk Task 第一个出现反压的节点
    如果是第二种情况,则需要排查下游节点
    值得注意的是,反压的根源节点并不一定在反压面板出现高反压。因为反压面板监控的是发送端,如果某个节点是性能瓶颈并不会导致它本身出现高反压,而是导致它的上游出现高反压。总体来看,如果我们找到第一个出现反压的节点,那么反压根源要么就是这个节点,要么是它紧接着的下有节点。
    怎么区分这两种情况呢,通过监控面板是无法给出判断的。这个时候就可以根据 Flink的指标监控来寻找是那一个sub task出现了反压的问题。
    我们在监控反压时会用到的Metrics主要和Channel 接收端的buffer使用率有关,最有用的是以下几个Metrics:

TaskManager传输数据时,不同的TaskManager上的两个SubTask间通常根据key的数量有多个Channel,这些Channel会复用同一个TaskManager级别的TCP链接,并且共享接收端SubTask级别的BufferPool。
TaskManager 传输数据时,不同的TaskManager上的两个SubTask间通常根据key的数量有多个channel,这些channel会复用同一个TaskManager级别的TCP链接,并且共享接收端SubTask级别的Buffer Pool。
在接收端,每个Channel在初始阶段会分配固定数量的 Exclusive Buffer,这些Buffer会被用于存储接收到的数据,交给Operator使用后再次被释放。Channel接收端空闲的Buffer数量成为Credit,Credit会被定时同步给发送端被后者用于决定发送多少个Buffer的数据。
在流量较大时,Channel的Exclusive Buffer可能会被写满,此时Flink会向Buffer Pool 申请剩余的Floating Buffer。这些Floating Buffer属于备用的Buffer,哪个Channel需要就去哪里。而在Channel 发送端一个Subtask所有的Channel会共享同一个Buffer Pool,这边就没有区分Exclusive Buffer和Floating Buffer。

outPoolUsage 和 inPoolUsage 同为低或同为高分别表明当前 Subtask 正常或处于被下游反压,这应该没有太多疑问。而比较有趣的是当 outPoolUsage 和 inPoolUsage 表现不同时,这可能是出于反压传导的中间状态或者表明该 Subtask 就是反压的根源。
如果一个 Subtask 的 outPoolUsage 是高,通常是被下游 Task 所影响,所以可以排查它本身是反压根源的可能性。如果一个 Subtask 的 outPoolUsage 是低,但其 inPoolUsage 是高,则表明它有可能是反压的根源。因为通常反压会传导至其上游,导致上游某些 Subtask 的 outPoolUsage 为高,我们可以根据这点来进一步判断。值得注意的是,反压有时是短暂的且影响不大,比如来自某个 Channel 的短暂网络延迟或者 TaskManager 的正常 GC,这种情况下我们可以不用处理。
对于 Flink 1.9 及以上版本,除了上述的表格,我们还可以根据 floatingBuffersUsage/exclusiveBuffersUsage 以及其上游 Task 的 outPoolUsage 来进行进一步的分析一个 Subtask 和其上游 Subtask 的数据传输。

通常来说,floatingBuffersUsage 为高则表明反压正在传导至上游,而 exclusiveBuffersUsage 则表明了反压是否存在倾斜(floatingBuffersUsage 高、exclusiveBuffersUsage 低为有倾斜,因为少数 channel 占用了大部分的 Floating Buffer)。
至此,我们已经有比较丰富的手段定位反压的根源是出现在哪个节点,但是具体的原因还没有办法找到。另外基于网络的反压 metrics 并不能定位到具体的 Operator,只能定位到 Task。特别是 embarrassingly parallel(易并行)的作业(所有的 Operator 会被放入一个 Task,因此只有一个节点),反压 metrics 则派不上用场。
定位到反压节点后,分析造成原因的办法和我们分析一个普通程序的性能瓶颈的办法是十分类似的,可能还要更简单一点,因为我们要观察的主要是 Task Thread。
在实践中,很多情况下的反压是由于数据倾斜造成的,这点我们可以通过 Web UI 各个 SubTask 的 Records Sent 和 Record Received 来确认,另外 Checkpoint detail 里不同 SubTask 的 State size 也是一个分析数据倾斜的有用指标。
此外,最常见的问题可能是用户代码的执行效率问题(频繁被阻塞或者性能问题)。最有用的办法就是对 TaskManager 进行 CPU profile,从中我们可以分析到 Task Thread 是否跑满一个 CPU 核:如果是的话要分析 CPU 主要花费在哪些函数里面,比如我们生产环境中就偶尔遇到卡在 Regex 的用户函数(ReDoS);如果不是的话要看 Task Thread 阻塞在哪里,可能是用户函数本身有些同步的调用,可能是 checkpoint 或者 GC 等系统活动导致的暂时系统暂停。
当然,性能分析的结果也可能是正常的,只是作业申请的资源不足而导致了反压,这就通常要求拓展并行度。值得一提的,在未来的版本 Flink 将会直接在 WebUI 提供 JVM 的 CPU 火焰图[5],这将大大简化性能瓶颈的分析。
另外 TaskManager 的内存以及 GC 问题也可能会导致反压,包括 TaskManager JVM 各区内存不合理导致的频繁 Full GC 甚至失联。推荐可以通过给 TaskManager 启用 G1 垃圾回收器来优化 GC,并加上 -XX:+PrintGCDetails 来打印 GC 日志的方式来观察 GC 的问题。

参考:
https://maimai.cn/article/detail?fid=1372302272&efid=s1cKvvDRtJYzA_5vRPJ7og

Flink反压如何排查相关推荐

  1. 【Flink】Flink 反压机制 导致checkpoint 失败

    1.概述 转载:flink检查点checkpoint失败问题总结-2 问题描述:检查点刚开始是可以的做checkpoint的,后期越来越不能够做checkpoint的情况总结 2.反压问题 2.1 什 ...

  2. 【Flink】Flink反压(背压)网络流控

    1.美图 2.概述 界面查看:Flink UI: Flink 1.10 如何查看 数据源 的背压(反压)情况(消费kafka) 为了判断是否进行反压,jobmanager会每50ms触发100次sta ...

  3. 火焰图分析Flink反压

    文章目录 现象 分析 猜想1 猜想2 猜想3 猜想4,确认代码变化 思考 大招(火焰图) On-cpu off-cpu 图 分析 火焰图 火焰图示例代码 生成火焰图 如何看 回到最开始的问题 总结 现 ...

  4. 一文搞懂 Flink 网络流控与反压机制

    看完本文,你能get到以下知识 Flink 流处理为什么需要网络流控? Flink V1.5 版之前网络流控介绍 Flink V1.5 版之前的反压策略存在的问题 Credit的反压策略实现原理,Cr ...

  5. Flink 网络流控与反压机制

    Flink 流处理为什么需要网络流控? 分析一个简单的 Flink 流任务,下图是一个简单的Flink流任务执行图:任务首先从 Kafka 中读取数据. map 算子对数据进行转换.keyBy 按照指 ...

  6. Flink核心篇,四大基石、容错机制、广播、反压、序列化、内存管理、资源管理...

    Flink基础篇,基本概念.设计理念.架构模型.编程模型.常用算子 大纲: 1.Flink的四大基石包含哪些? 2.讲一下Flink的Time概念? 3.介绍下Flink窗口,以及划分机制? 4.介绍 ...

  7. 背压/反压/BackPressure

    Flink系列文章 更多Flink系列文章请点击Flink系列文章 更多大数据文章请点击大数据好文推荐 转载声明 本文大量内容系转载自以下文章,有删改,并参考其他文档资料加入了一些内容: Apache ...

  8. 如何处理分析Flink作业反压的问题?

    本文分享自华为云社区<一个Flink作业反压的问题分析>,原文作者:Yunz Bao . 反压(backpressure)是实时计算应用开发中,特别是流式计算中,十分常见的问题.反压意味着 ...

  9. flink 出现反压场景, 异常场景造成Exceeded checkpoint tolerable failure threshold.

    flink 出现反压场景,异常场景造成Exceeded checkpoint tolerable failure threshold. 监控反压情况 根据算子的InPool, OutPool 的比例, ...

最新文章

  1. (转)java 中的try catch finally 语句中含有return语句的执行情况(总结版)
  2. Oracle-等待事件解读
  3. Python爬虫入门(1):综述
  4. 回归的误差服从正态分布吗_盘点10大回归类型:总有一款深得你心
  5. Qt工作笔记-QLineEdit与QTextEdit与QPlainTextEdit区别与联系以及适用范围
  6. android根据中心裁剪图片,拍照,选择照片并进行裁剪,适配Android 7.0
  7. (TOJ1531)爱的伟大意义
  8. android window设置动画,android - 具有动画的Windowmanager
  9. acm的ubuntu (ubuntu16.04 安装指南,chrome安装,vim配置,git设置和github,装QQ)
  10. oracle批量新增字段工具,mybatis 中oracle 批量新增三种方法
  11. 张亚勤新作《变革中的思索》谈高科技人才管理
  12. 并发编程之美(1)并发编程基础
  13. oracle怎么查找数据泵,ORACLE数据泵使用详解
  14. Android 自定义搜索框(带搜索图标、清除图标、语音图标)
  15. win10去掉微软拼音的简繁体转换
  16. python设计贪吃蛇游戏论文_150行python代码实现贪吃蛇游戏
  17. Flask教程(十九)SocketIO
  18. python列表中的元素可以是不同类型_Python列表中所有元素必须为相同类型的数据。...
  19. 看看老牛是如何给陈彤写的信的
  20. 《初级会计实务》考试学习分享之第五章 ——收入、费用和利润【考试大纲】

热门文章

  1. java 递归习题训练,Java蓝桥杯——递归练习题:走台阶(偶数版)
  2. 思科设备VLAN配置命令
  3. jpa vue管理系统_如何通过利用Java流获取类型安全和直观的Hibernate / JPA查询
  4. 8千多英语语法练习题ACCESS\EXCEL数据库
  5. 消气机器人_星新一少年科幻·淘气的机器人最新章节_星新一著_掌阅小说网
  6. 丢手帕问题 java_初学java丢手帕问题
  7. 优秀网页设计:35个吸引眼球的精美作品集网站
  8. oracle 查询数据库时区,[原创]数据库时区与操作系统不一致时的解决方法
  9. ThreadLock
  10. 迷宫寻宝(一) 82