【Flink精讲】Flink反压调优

Flink 网络流控及反压的介绍:

Apache Flink学习网

反压的理解

简单来说, Flink 拓扑中每个节点(Task)间的数据都以阻塞队列的方式传输,下游来不及消费导致队列被占满后,上游的生产也会被阻塞,最终导致数据源的摄入被阻塞。反压(BackPressure) 通常产生于这样的场景:短时间的负载高峰导致系统接收数据的速率远高于它处理数据的速率。许多日常问题都会导致反压,例如,垃圾回收停顿可能会导致流入的数据快速堆积,或遇到大促、秒杀活动导致流量陡增。

反压的危害

反压如果不能得到正确的处理, 可能会影响到 checkpoint 时长和 state 大小,甚至可能会导致资源耗尽甚至系统崩溃。

1)影响 checkpoint 时长: barrier 不会越过普通数据,数据处理被阻塞也会导致checkpoint barrier 流经整个数据管道的时长变长, 导致 checkpoint 总体时间(End to End Duration)变长。

2)影响 state 大小: barrier 对齐时,接受到较快的输入管道的 barrier 后,它后面数据会被缓存起来但不处理,直到较慢的输入管道的 barrier 也到达,这些被缓存的数据会被放到 state 里面,导致 checkpoint 变大。

这两个影响对于生产环境的作业来说是十分危险的,因为 checkpoint 是保证数据一致性的关键, checkpoint 时间变长有可能导致 checkpoint 超时失败,而 state 大小同样可能拖慢 checkpoint 甚至导致 OOM (使用 Heap-based StateBackend)或者物理内存使用超出容器资源(使用 RocksDBStateBackend)的稳定性问题。

因此,我们在生产中要尽量避免出现反压的情况。

Flink Web UI 的反压监控提供了 SubTask 级别的反压监控, 1.13 版本以前是通过周期性对 Task 线程的栈信息采样,得到线程被阻塞在请求 Buffer (意味着被下游队列阻塞)的频率来判断该节点是否处于反压状态。默认配置下,这个频率在 0.1 以下则为 OK, 0.1至 0.5 为 LOW,而超过 0.5 则为 HIGH。

Flink 1.13 优化了反压检测的逻辑(使用基于任务 Mailbox 计时,而不在再于堆栈采样),并且重新实现了作业图的 UI 展示: Flink 现在在 UI 上通过颜色和数值来展示繁忙和反压的程度。

分析瓶颈算子

如果处于反压状态,那么有两种可能性:

(1) 该节点的发送速率跟不上它的产生数据速率。这一般会发生在一条输入多条输出的 Operator(比如 flatmap)。 这种情况,该节点是反压的根源节点,它是从 Source Task到 Sink Task 的第一个出现反压的节点。

(2) 下游的节点接受速率较慢,通过反压机制限制了该节点的发送速率。 这种情况,需要继续排查下游节点,一直找到第一个为 OK 的一般就是根源节点。总体来看,如果我们找到第一个出现反压的节点,反压根源要么是就这个节点,要么是它紧接着的下游节点。

通常来讲,第二种情况更常见。 如果无法确定,还需要结合 Metrics 进一步判断。

利用 Metrics 定位

监控反压时会用到的 Metrics 主要和 Channel 接受端的 Buffer 使用率有关,最为有用的是以下几个 Metrics:

其中 inPoolUsage = floatingBuffersUsage + exclusiveBuffersUsage。

1)根据指标分析反压

分析反压的大致思路是:如果一个 Subtask 的发送端 Buffer 占用率很高,则表明它

被下游反压限速了;如果一个 Subtask 的接受端 Buffer 占用很高,则表明它将反压传导

至上游。反压情况可以根据以下表格进行对号入座(1.9 以上):

2) 可以进一步分析数据传输

Flink 1.9及以上版本,还可以根据 floatingBuffersUsage/exclusiveBuffersUsage 以及其上游 Task 的 outPoolUsage 来进行进一步的分析一个 Subtask 和其上游Subtask 的数据传输。

在流量较大时, Channel 的 Exclusive Buffer 可能会被写满,此时 Flink 会向 Buffer Pool 申请剩余的 Floating Buffer。这些 Floating Buffer 属于备用 Buffer。

总结:

1) floatingBuffersUsage 为高, 则表明反压正在传导至上游

2) 同时 exclusiveBuffersUsage 为低, 则表明可能有倾斜

比如, floatingBuffersUsage 高、 exclusiveBuffersUsage 低为有倾斜,因为少数channel 占用了大部分的 Floating Buffer。

相关推荐
Mr数据杨11 分钟前
成人收入预测建模与信用评估应用
大数据·人工智能·机器学习·数据分析·kaggle
十六年开源服务商37 分钟前
门户网站迁移WordPress完整方案2026
大数据
qyr678938 分钟前
全球多旋翼无人机动力系统市场分析报告
大数据·人工智能·数据分析·市场报告·多旋翼无人机动力系统
腾讯云大数据40 分钟前
腾讯云大数据出海实践:一套架构支撑跨国企业的全球数据平台
大数据·架构·云计算·腾讯云
juniperhan1 小时前
Flink 系列第12篇:Flink 维表关联详解
大数据·数据仓库·分布式·flink
嘉立创FPC苗工2 小时前
多层 FPC 阻抗控制:从原理到实践的全流程指南
大数据·制造·fpc·电路板
查古穆2 小时前
AI Agent 开发的工业化道路:Harness 架构深度解析
大数据·人工智能
qyz_hr2 小时前
2026年AI招聘选购:5大品牌核心差异对比(红海云 / Moka / 北森 / 肯耐珂萨 / 金蝶)
大数据·人工智能
xcbrand2 小时前
工业制造品牌全案公司哪家专业
大数据·人工智能·python·制造
南棱笑笑生2 小时前
20260420给万象奥科的开发板HD-RK3576-PI适配瑞芯微原厂的Buildroot时使用ll命令
java·大数据·elasticsearch·rockchip