news 2026/2/6 12:21:06

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/1/29 14:33:37

当AI学会“拍电影“:SkyReels V1如何让你的RTX 4090变身好莱坞工作站

"给我一张照片,我能让它动起来;给我一句话,我能把它拍成电影。"这不是科幻小说的情节,而是SkyReels V1正在做的事情。更酷的是,你不需要A100集群,一张RTX 4090就能让这个魔法在你的桌面上发生。 一、开场白&#xff1a;视频生成的"三座大山"与破局之道 1.…

作者头像 李华
网站建设 2026/2/4 4:37:53

从零入门CANN:揭秘华为昇腾AI计算的核心引擎

# 从零入门CANN&#xff1a;揭秘华为昇腾AI计算的核心引擎> &#x1f4cc; **关键词**&#xff1a;CANN、昇腾AI、Ascend、国产芯片、MindSpore、异构计算 > &#x1f4a1; **适合人群**&#xff1a;AI初学者、高校学生、转行开发者、信创从业者 > ⏱️ **阅读时间…

作者头像 李华
网站建设 2026/2/4 3:58:29

Vue 开发者必看:3 步搞定 dart-sass 替换 node-sass(告别编译慢 +

Vue 开发者必看&#xff1a;3 步搞定 dart-sass 替换 node-sass&#xff08;告别编译慢 Vue 开发者必看&#xff1a;3 步搞定 dart-sass 替换 node-sass&#xff08;告别编译慢 兼容坑&#xff09;引言&#xff1a;为什么我们要和 node-sass 说拜拜技术背景速览&#xff1a;s…

作者头像 李华
网站建设 2026/2/5 21:38:49

.NET进阶——深入理解委托(3)事件入门

为什么我要把事件放在委托这个专题里呢&#xff1f;主要的原因是事件是委托的高级封装。 换句话说&#xff0c;先有委托才有事件&#xff0c;委托是事件的基础&#xff0c;事件是委托的封装。 我们先看一个不用委托的例子&#xff0c;这个代码要求实现这样的功能&#xff1a;小…

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

springboot基于vue的仓库进销存管理系统的可视化分析系统 97lgaf55

目录已开发项目效果实现截图开发技术系统开发工具&#xff1a;核心代码参考示例1.建立用户稀疏矩阵&#xff0c;用于用户相似度计算【相似度矩阵】2.计算目标用户与其他用户的相似度系统测试总结源码文档获取/同行可拿货,招校园代理 &#xff1a;文章底部获取博主联系方式&…

作者头像 李华
网站建设 2026/2/4 7:23:04

springboot基于vue的共享自习室座位选座系统_8m2lz8s1

目录已开发项目效果实现截图开发技术系统开发工具&#xff1a;核心代码参考示例1.建立用户稀疏矩阵&#xff0c;用于用户相似度计算【相似度矩阵】2.计算目标用户与其他用户的相似度系统测试总结源码文档获取/同行可拿货,招校园代理 &#xff1a;文章底部获取博主联系方式&…

作者头像 李华