Flink 的背压机制(Back Pressure)
什么是 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
事件,并且基于 processingDelay
、schedulingDelay
、当前批处理的记录条数以及处理完成事件来估算出一个速率,用于更新流每秒能够处理的最大记录的条数。会随着数据能力进行调整,来保证 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)相关推荐
- Flink的背压机制
想起来之前被问到了一个问题,如果Flink中的Task是一直不停的运行的话,那么拉取Kafka数据的Source端是不是会一直不停的拉取数据,如果消费速度不及时,内存不就很快会被撑爆了么?一开始对这个 ...
- Flink的容错机制
文章目录 检查点 检查点的保存 从检查点恢复状态 检查点算法 检查点配置 1.启动检查点 2.检查点存储 3.其他高级配置 保存点 1.保存点的用途 2.使用保存点 状态一致性 一致性的概念和级别 端 ...
- Flink系列-背压(反压)
目录 了解背压 什么是背压 背压产生的原因 背压导致的影响 定位背压 解决背压 了解背压 什么是背压 在流式处理系统中,如果出现下游消费的速度跟不上上游生产数据的速度,就种现象就叫做背压 (backp ...
- Flink 如何处理背压
传送门:Flink 系统性学习笔记 Flink 1.4 版本 人们经常会问 Flink 是如何处理背压的.答案很简单:Flink 不使用任何复杂的机制,因为它不需要任何处理机制.只凭借数据流引擎,就可 ...
- Flink的背压问题产生原因和解决方法
最近flink job出现了背压的问题, 后果是导致了checkpoint的生成超时, 影响了flink job的运行. 定位问题: 如下图: 1) flink的checkpoint生成超时, 失败: ...
- Flink的CheckPoint机制
这里已经是Flink的第三篇原创啦.第一篇:Flink入门讲解了Flink的基础和相关概念,第二篇:压背原理,讲解了什么是背压,在Flink背压大概的流程是怎么样的. 这篇来讲Flink另一个比较重要 ...
- Flink中容错机制 完整使用 (第十章)
Flink中容错机制 完整使用 一.容错机制 1.检查点(Checkpoint) 1. 检查点的保存 1. 周期性的触发保存 2. 保存的时间点 3. 保存的具体流程 2.从检查点恢复状态 (1)重启 ...
- 【Flink】 Flink JobManager HA 机制的扩展与实现
1.概述 转载:Flink 源码阅读笔记(21)- Flink JobManager HA 机制的扩展与实现 在 Flink 1.12 中,Flink on Kubernetes 的 Native 部 ...
- Node.js stream模块(三)背压机制
我们知道 可读流是作为数据生产者,而可写流作为数据消费者. 那么二者必然是可以结合使用的.即可读流生产出来的数据给可写流消费. 我们这里使用文件可读流和文件可写流来模拟这种情况: 实现很简单,可读流对 ...
最新文章
- 有哪一种编程语言比其他的更安全吗?
- 2018牛客网暑假ACM多校训练赛(第三场)I Expected Size of Random Convex Hull 计算几何,凸包,其他...
- art-template入门(五)之模板变量
- 计算机程序的建立命令,数控车床编程指令 编程由一系列的指令组成
- linux 检查mps版本,linux_mps启动流程_存储相关.doc
- 1001. A+B Format
- BZOJ5243 : [Lydsy2017省队十连测]绝版题
- 矩形变弧度角_懒惰使人类进步:不想刷马桶,那就让马桶自己变干净丨种草机...
- java model1和model2_Java项目(4)——探究两种开发模型的异同-Model1与Model2
- java集合大家族之Map
- MATLAB求余运算
- Python爬虫16-Scrapy爬取阳光政务平台信息
- 3种方法解决txt文档乱码
- 无纸化考试系统(CS)
- 使用AutoHotKey将多行内容转成单行并翻译或获取中文拼音
- 哪种手机便签软件可以打印,支持打印的手机便签软件
- Android常见页面布局
- 2022年全球市场机器视觉频闪仪总体规模、主要生产商、主要地区、产品和应用细分研究报告
- Spring Cloud Eureka整合 Seata 实现分布式事务
- Python 搭建云服务和小程序“云办公”
热门文章
- POJ 2375 Cow Ski Area 增加最小边使图强连通
- 开发人员项目开发的步骤
- 利用建造者(Builder)模式构建 Java 对象
- vc获取n卡编号_如何让G45实现VC-1和H.264的硬解码
- Required string parameter ‘XXX‘ is not present
- IL2CPP does not support marshaling delegates that point to instance methods to native code
- 我爱计算机专业作文1000字,计算机人作文1000字
- 惊魂一小时:全国域名解析首遭大规模污染
- 永远的圣斗士—曾经的光辉岁月
- 求解n阶方阵零化多项式的mathematica代码