news 2026/6/15 18:28:07

Flink学习笔记:反压

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Flink学习笔记:反压

今天来聊在 Flink 运维过程中比较常见的一个问题:反压。

什么是反压

反压是流式系统中关于数据处理能力的动态反馈机制,并且是从下游到上游的反馈,一般发生在上游节点的生产速度大于下游节点的消费速度的情况。

数据如何传输

在了解反压的细节之前,首先要知道 Flink 中数据是如何传输的。在 Flink 中,两个算子之间的关系分为三种:

  1. 部署在同一个 TaskManager 上,且属于同一算子链。

  2. 部署在同一个 TaskManager 上,但不是同一个算子链。

  3. 部署在不同的 TaskManager 上。

三种不同的关系,对应的算子间的数据传输方式也不同。先说第一种。

同一线程数据传输

同一线程中的两个算子共享内存,因此数据传输非常简单,上游产出好数据后,直接调用下游的 processElement 方法即可。

本地线程数据传输

对于第二种关系,两个算子不在同一线程,但是部署在同一个 TaskManager 上,也就是算子之间的数据传输是跨线程的。我们通过一个图来解释。

图中,Flat Map Task 是上游算子,sum 是下游的算子。它们共享一块 Buffer 内存。当 Buffer 中没有数据可以消费时,sum 所在的线程会阻塞(步骤1)。随着数据的流入,Flat Map Task 会将处理好的数据写入到 ResultSubpartition(步骤2),然后 flush 到 Buffer 中(步骤3)。此时会唤醒 sum 所在的线程(步骤4),它就可以从 Buffer 中读取数据了(步骤5)。

远程数据传输

第三种跨 TaskManager 的数据传输,与第二种类似,不过也有些区别。我们还是通过一张图来解释。

从图中可以看到,当 sum 所在线程没有 Buffer 可以消费时,会通过 PartitionRequestClient 向 Flat Map Task 所在的进程发送请求。Flat Map Task 所在进程接收到请求后,会读取 Buffer 中的数据并返回。

Flink 的反压

了解了 Flink 的数据传输方式之后,我们再来看下 Flink 是如何感知反压的。

上图是一个数据传输的简图。当 Task1 有 Buffer 空间时,记录 A 被序列化并写入 LocalBufferPool 中,接着发送到 Task2 的 LocalBufferPool 中,Task2 读取并反序列化后交由程序处理。

这里我们也分两个场景讨论。

本地传输

Task1 和 Task2 在同一个 TaskManager 节点,Task1 和 Task2 共用 Buffer,一旦 Task2 消费了 Buffer,该 Buffer 就会被回收。如果 Task2 的处理速度比 Task1 慢,那么 Buffer 的回收速度就赶不上 Task1 取 Buffer 的速度,这样会导致无 Buffer 可用,最终 Task1 就会降速。

远程传输

Task1 和 Task2 运行在不同的 TaskManager 上,那 Buffer 会发送到网络后,等接收端消费完再回收。在发送端,会通过 Netty 水位机制来保证不往网络中写太多数据,如果网络中的数据超过了高水位值,就会等其下降到低水位值以下才会继续写数据。如果网络有堆积,发送端就会暂停发送,Buffer 也不会被回收,这就会阻塞 writer 往 ResultSubPartition 中写数据。

反压监控

在 Flink Web UI 中,可以找到反压的监控

它有三种状态:

  • OK: 0% <= 反压比例 <= 10%,此时一般不用处理。
  • LOW: 10% < 反压比例 <= 50%,这种状态需要关注。
  • HIGH: 50% < 反压比例 <= 100%,已经反压,需要赶快处理。

总结

今天我们聊了什么是反压,以及 Flink 中数据传输方法和 Flink 任务是如何感知反压的。Flink 的传输方式分为三种,分别是同线程传输、本地跨线程传输以及远程传输。Flink 任务在感知反压时也分别针对本地传输和远程传输做了讨论。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/15 14:30:14

Python 期末复习知识点汇总

Python 期末知识点汇总 本文聚焦 Python 期末考核核心知识点&#xff0c;从基础到进阶分层梳理&#xff0c;覆盖语法、数据结构、流程控制、函数、面向对象、文件操作、异常处理等高频考点&#xff0c;适合期末复习冲刺。 一、基础语法&#xff08;必考&#xff09; 1. 编码规范…

作者头像 李华
网站建设 2026/6/15 3:16:42

线程、并发与互斥:解锁多任务编程的核心逻辑

线程、并发与互斥&#xff1a;解锁多任务编程的核心逻辑 一、线程&#xff1a;多任务执行的最小单元 线程是操作系统调度的基本单位&#xff0c;它依附于进程存在&#xff0c;共享进程的内存空间&#xff08;代码段、数据段、堆等&#xff09;&#xff0c;但拥有独立的程序计数…

作者头像 李华
网站建设 2026/6/15 7:59:18

Day35文件的规范拆分和写法

credit_default_prediction/ │ ├── data/ # 数据文件夹 │ ├── raw/ # 原始数据 │ └── processed/ # 处理后的数据 │ ├── src/ # 源代码 │ ├── __init__.py │ ├── data/ …

作者头像 李华
网站建设 2026/6/15 1:28:47

GPT-5.2来了,老金详细给你说说它为什么是王

加我进AI讨论学习群&#xff0c;公众号右下角“联系方式”文末有老金的 开源知识库地址全免费昨晚凌晨2点&#xff0c;OpenAI偷偷摸摸上线了GPT-5.2。没发布会&#xff0c;没预热&#xff0c;甚至连个官方推特都没发。作为老金最喜欢的模型&#xff0c;没有之一的&#xff0c;必…

作者头像 李华
网站建设 2026/6/15 9:22:14

上海“娃哈哈”桶装水将改名 “沪小娃“ !

近日上海娃哈哈推出全新品牌 "沪小娃" 桶装水&#xff0c;说是"娃哈哈"商标授权已到期&#xff0c;且未能获得新的授权&#xff0c;被集团要求停止使用原有品牌&#xff0c;称此举是为了活下去的无奈之举&#xff0c;承认打造新品牌难度很大。普推知商标老…

作者头像 李华