什么是 Back Pressure

如果看到任务的背压警告(如 High 级别),这意味着 生成数据的速度比下游算子消费的的速度快。以一个简单的 Source -> Sink 作业为例。如果能看到 Source 有警告,这意味着 Sink 消耗数据的速度比 Source 生成速度慢。Sink 正在向 Source 施加反压。

许多情况都会导致背压。例如,GC导致传入数据堆积,或者数据源在发送数据的速度上达到峰值。如果没有正确处理反压力,可能会导致资源耗尽,甚至在最坏的情况下,数据丢失。

看一个简单的例子。假设数据流 pipeline(抽象为 Source,Streaming job 和 Sink)在稳定状态下以每秒500万个元素的速度处理数据,如下所示正常情况(一个黑色条代表100万个元素,下图表示系统1秒内的快照):

No backpressure

如果 Source 发送数据的速度在某个时刻达到了峰值,每秒生成的数据达到了双倍,下游的处理能力不变:

Backpressure

消息处理速度 < 消息的发送速度,消息拥堵,系统运行不畅。如何处理这种情况?

a. 可以去掉这些元素,但是,对于许多流应用程序来说,数据丢失是不可接受的。
b. 将拥堵的消息缓存起来,并告知消息发送者减缓消息发送的速度。消息缓存应该是持久的,因为在发生故障的情况下,需要重放这些数据以防止数据丢失。

Buffer records

背压实现

采样线程

背压监测通过反复获取正在运行的任务的堆栈跟踪的样本来工作,JobManager 对作业重复调用 Thread.getStackTrace()

Sample

如果采样(samples)显示任务线程卡在某个内部方法调用中,则表示该任务存在背压。

默认情况下,JobManager 每50ms为每个任务触发100个堆栈跟踪,来确定背压。在Web界面中看到的比率表示在内部方法调用中有多少堆栈跟踪被阻塞,例如,0.01表示该方法中只有1个被卡住。状态和比率的对照如下:
OK:0 <= Ratio <= 0.10
LOW:0.10 <Ratio <= 0.5
HIGH:0.5 <Ratio <= 1

为了不使堆栈跟踪样本对 TaskManager 负载过高,每60秒会刷新采样数据。

配置

可以使用以下配置 JobManager 的采样数:

  • web.backpressure.refresh-interval,统计数据被废弃重新刷新的时间(默认值:60000,1分钟)。
  • web.backpressure.num-samples,用于确定背压的堆栈跟踪样本数(默认值:100)。
  • web.backpressure.delay-between-samples,堆栈跟踪样本之间的延迟以确定背压(默认值:50,50ms)。

Web 显示

在 Flink WebUI 的作业界面中可以看到 Back Pressure 选项页面。

采样中
表示 JobManager 对正在运行的任务触发堆栈跟踪采样。默认配置,大约会花费五秒钟。

Sampling

背压状态

运行正常状态

OK

背压状态

High

对比 Spark streaming

Spark Streaming 的 back pressure 是从1.5版本以后引入。在之前版本,只能通过限制最大消费速度。这种限速的弊端很明显,假如下游处理能力超过了这个最大的限制,会导致资源浪费。而且需要对每个 Spark Streaming 作业进行压测预估,成本比较高。

从1.5版本开始引入了 back pressure,实现自动调节数据的传输速率,其监听所有作业的 onBatchCompleted 事件,并且基于 processingDelayschedulingDelay、当前批处理的记录条数以及处理完成事件来估算出一个速率,用于更新流每秒能够处理的最大记录的条数。会随着数据能力进行调整,来保证 Spark Streaming 流畅运行。

总结:Streaming 的背压主要是根据下游任务的执行情况等,来控制上游的速率。Flink 的背压是通过一定时间内堆栈跟踪,监控阻塞的比率来确定背压的。


Reference:
https://ci.apache.org/projects/flink/flink-docs-release-1.6/monitoring/back_pressure.html
https://www.da-platform.com/blog/how-flink-handles-backpressure

Flink 的背压机制(Back Pressure)相关推荐

  1. Flink的背压机制

    想起来之前被问到了一个问题,如果Flink中的Task是一直不停的运行的话,那么拉取Kafka数据的Source端是不是会一直不停的拉取数据,如果消费速度不及时,内存不就很快会被撑爆了么?一开始对这个 ...

  2. Flink的容错机制

    文章目录 检查点 检查点的保存 从检查点恢复状态 检查点算法 检查点配置 1.启动检查点 2.检查点存储 3.其他高级配置 保存点 1.保存点的用途 2.使用保存点 状态一致性 一致性的概念和级别 端 ...

  3. Flink系列-背压(反压)

    目录 了解背压 什么是背压 背压产生的原因 背压导致的影响 定位背压 解决背压 了解背压 什么是背压 在流式处理系统中,如果出现下游消费的速度跟不上上游生产数据的速度,就种现象就叫做背压 (backp ...

  4. Flink 如何处理背压

    传送门:Flink 系统性学习笔记 Flink 1.4 版本 人们经常会问 Flink 是如何处理背压的.答案很简单:Flink 不使用任何复杂的机制,因为它不需要任何处理机制.只凭借数据流引擎,就可 ...

  5. Flink的背压问题产生原因和解决方法

    最近flink job出现了背压的问题, 后果是导致了checkpoint的生成超时, 影响了flink job的运行. 定位问题: 如下图: 1) flink的checkpoint生成超时, 失败: ...

  6. Flink的CheckPoint机制

    这里已经是Flink的第三篇原创啦.第一篇:Flink入门讲解了Flink的基础和相关概念,第二篇:压背原理,讲解了什么是背压,在Flink背压大概的流程是怎么样的. 这篇来讲Flink另一个比较重要 ...

  7. Flink中容错机制 完整使用 (第十章)

    Flink中容错机制 完整使用 一.容错机制 1.检查点(Checkpoint) 1. 检查点的保存 1. 周期性的触发保存 2. 保存的时间点 3. 保存的具体流程 2.从检查点恢复状态 (1)重启 ...

  8. 【Flink】 Flink JobManager HA 机制的扩展与实现

    1.概述 转载:Flink 源码阅读笔记(21)- Flink JobManager HA 机制的扩展与实现 在 Flink 1.12 中,Flink on Kubernetes 的 Native 部 ...

  9. Node.js stream模块(三)背压机制

    我们知道 可读流是作为数据生产者,而可写流作为数据消费者. 那么二者必然是可以结合使用的.即可读流生产出来的数据给可写流消费. 我们这里使用文件可读流和文件可写流来模拟这种情况: 实现很简单,可读流对 ...

最新文章

  1. 有哪一种编程语言比其他的更安全吗?
  2. 2018牛客网暑假ACM多校训练赛(第三场)I Expected Size of Random Convex Hull 计算几何,凸包,其他...
  3. art-template入门(五)之模板变量
  4. 计算机程序的建立命令,数控车床编程指令 编程由一系列的指令组成
  5. linux 检查mps版本,linux_mps启动流程_存储相关.doc
  6. 1001. A+B Format
  7. BZOJ5243 : [Lydsy2017省队十连测]绝版题
  8. 矩形变弧度角_懒惰使人类进步:不想刷马桶,那就让马桶自己变干净丨种草机...
  9. java model1和model2_Java项目(4)——探究两种开发模型的异同-Model1与Model2
  10. java集合大家族之Map
  11. MATLAB求余运算
  12. Python爬虫16-Scrapy爬取阳光政务平台信息
  13. 3种方法解决txt文档乱码
  14. 无纸化考试系统(CS)
  15. 使用AutoHotKey将多行内容转成单行并翻译或获取中文拼音
  16. 哪种手机便签软件可以打印,支持打印的手机便签软件
  17. Android常见页面布局
  18. 2022年全球市场机器视觉频闪仪总体规模、主要生产商、主要地区、产品和应用细分研究报告
  19. Spring Cloud Eureka整合 Seata 实现分布式事务
  20. Python 搭建云服务和小程序“云办公”

热门文章

  1. POJ 2375 Cow Ski Area 增加最小边使图强连通
  2. 开发人员项目开发的步骤
  3. 利用建造者(Builder)模式构建 Java 对象
  4. vc获取n卡编号_如何让G45实现VC-1和H.264的硬解码
  5. Required string parameter ‘XXX‘ is not present
  6. IL2CPP does not support marshaling delegates that point to instance methods to native code
  7. 我爱计算机专业作文1000字,计算机人作文1000字
  8. 惊魂一小时:全国域名解析首遭大规模污染
  9. 永远的圣斗士—曾经的光辉岁月
  10. 求解n阶方阵零化多项式的mathematica代码