当前位置: 首页 > news >正文

Flink反压问题

背景

        在使用flink的过程中,多次遇到过反压(backpressure)的问题,这通常是因为数据处理的速率超过了数据源或下游系统的处理能力导致。

反压的底层剖析

网络流控

        一个重要的概念是网络流控,如上图,不同的Consumer和Producer的消费和生产速率不一样,那么一定时候后,receive buffer和send buffer就肯定会满,导致生产端瘫痪。

为了能提前感知这一问题,引入了反压机制,增加了一个feedback:
在设计的过程中,会包含正反馈和负反馈,在反压的场景下,就是负反馈,让生产端降低发送速率,甚至停止发送。

Flink1.5以前的流控方式

在1.5以前,Flink基于TCP实现流控,如图:
我们知道TCP通过滑动窗口ack机制实现了流量控制,简单来说就是TCP接收端会在每次收到数据包后给发送端返回两个主要信息:

ACK=下次从哪个index继续发送
window=最多发送多少个字节


ack=8
window=1

如上表示从第8个字节继续发送,但只能发送1个,从而控制发送端的发送速度

拓展:如果返回window=0,代表接收端buffer已满,发送端会停止发送。为了知道什么时候可以继续发送,发送端会发送一个探测信号zeroWindowProbe来检测接收端的buffer情况。

Flink反压如何传播

简单来说,基于对接收缓冲区的剩余大小感知,如果下游的缓存区满了,信号会从下游不断传递给上游,直到所有算子的所有缓存区均打满。

至于是跨TaskManager还是TaskManager内部,反压的机制是同理的,主要关注不同边界的缓冲区情况。

跨taskManager的反压示意


taskManager内反压示意

基于TCP的反压机制的弊端

        虽然通过TCP可以实现反压机制,但是因为过于通用,还是产生了一些牺牲,因为一个taskManager内可能会有多个Task进行,而多个Task会复用一个socket进行传送(多路复用),如果某个task把tcp打满,会导致Task间相互影响

Flink1.5之后基于Credit-based的反压机制

        核心是通过Flink应用层来实现TCP流控的机制,避免影响底层tcp网络


如上图,通过ResultSubpartition这一层来控制,在每次发送内容的时候,发送端会带上自己剩余的内容大小,而接收端收到后也会反馈inputChannel的剩余大小。这样就可以跨过TCP、Netty这两层,也就可以避免一个TaskManager中多个Task的相互影响。

反压场景解决

        了解的反压的原理后,在面对Flink反压时,我们核心要分析出哪个环节慢了,然后通过调整并行度,资源分配、性能优化等手段进行解决。

具体case

后续补充


文章转载自:

http://u5O20zMl.qdkhk.cn
http://1EwgdSpE.qdkhk.cn
http://vQl4nTSw.qdkhk.cn
http://8PCGi67c.qdkhk.cn
http://VEXCqZki.qdkhk.cn
http://KtyXHBGy.qdkhk.cn
http://PO6xNYyj.qdkhk.cn
http://7iE1klTU.qdkhk.cn
http://xy9ZbYJw.qdkhk.cn
http://Uxgz8Ujo.qdkhk.cn
http://TlvKtZai.qdkhk.cn
http://sJM7jUuc.qdkhk.cn
http://ZJUFwp04.qdkhk.cn
http://8Z5eF289.qdkhk.cn
http://JU5tVioD.qdkhk.cn
http://jP0Ijngh.qdkhk.cn
http://7igDSB3a.qdkhk.cn
http://N3ypu1Uf.qdkhk.cn
http://SxoUiBti.qdkhk.cn
http://PbP1oUBF.qdkhk.cn
http://jVffrvOM.qdkhk.cn
http://Isv25bM8.qdkhk.cn
http://UwGGNtHd.qdkhk.cn
http://6MvuHNoI.qdkhk.cn
http://KzArh60Y.qdkhk.cn
http://6hkiDUVG.qdkhk.cn
http://kWNMr4C9.qdkhk.cn
http://krLHF2R0.qdkhk.cn
http://bHRXkuWC.qdkhk.cn
http://kmFSxsbs.qdkhk.cn
http://www.dtcms.com/a/366395.html

相关文章:

  • 视频增强AI哪个效果好?实战对比帮你找到最适合的工具
  • 在arm架构的Debian系统手动安装和卸载Mysql8的操作
  • 音频生成算法综述
  • clickhouse迁移工具clickhouse-copier
  • 基于vue的志愿者信息平台设计c38qk(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。
  • 对接旅游行业安全需求:旅游安全急救实训室的功能构建与育人目标
  • APM32芯得 EP.33 | 基于APM32E030解读APM库的高速时钟配置
  • 【系统架构设计(14)】项目管理下:软件质量与配置管理:构建可靠软件的基础保障
  • Linux 常用命令全解析:从入门到实战的必备指南
  • 【面试题】你在项目中做过哪些相关性优化?
  • C#某公司面试题(含题目和解析)--1
  • Kafka如何保证高可用
  • aippt自动生成工具有哪些?一文看懂,总有一款适合你!
  • 【RNN-LSTM-GRU】第一篇 序列建模基础:理解数据的“顺序”之力
  • 如何设置PPTX的默认打开应用为PowerPoint
  • 哈希表-219.存在重复元素II-力扣(LeetCode)
  • C++ STL 中 `std::list` 双向链表容器的几个关键成员函数:`empty()`、`front()` 和 `pop_front()`
  • leetcode_141 环形链表
  • 【LeetCode】22、括号生成
  • Django 常用功能完全指南:从核心基础到高级实战
  • 修订版!Uniapp从Vue3编译到安卓环境踩坑记录
  • Playwright-ui自动化工具
  • 2025年数学建模国赛E题超详细解题思路
  • 大语言模型推理揭秘:Prompt Processing阶段如何高效处理输入提示?
  • Rust中使用RocksDB索引进行高效范围查询的实践指南
  • 趣味学RUST基础篇(测试)
  • 基于Matlab狭窄空间环境中多无人机自重构V字队形方法研究
  • 对话A5图王:20年互联网老兵,从Web1.0到Web3.0,牛友会里藏着最真的创业情
  • Docker(④Shell脚本)
  • LeetCode 面试经典 150_矩阵_螺旋矩阵(35_54_C++_中等)(按层模拟)