【大数据_Flink-到底什么是Flink的反压,现象是什么,如何解决优化以及避免反压】 一、什么是Flink反压先搞懂本质你可以把Flink的数据流理解成一串首尾相接的水管每个算子就是水管上的一个加工/开关节点数据就是水管里的水上游是水龙头下游是接水的容器正常情况下上游出水速度和下游接水/处理速度匹配水流通畅如果下游接水太慢比如容器太小、倒水太慢水管里的水就会在下游前面积压甚至撑爆水管这时候下游就会给上游发信号「别倒了我忙不过来」上游就自动减慢甚至暂停出水。这个「下游给上游踩刹车」的自我保护机制就是Flink的反压Backpressure[1]。本质就是上下游数据处理速度不匹配下游通过信号限制上游的发送速度避免系统被海量数据压垮。二、反压的常见现象怎么判断有没有反压反压的迹象非常明显很容易识别界面直接标红Flink的Web管理后台会直接给高反压的算子标红显示反压等级是HIGH1.13版本后还会用颜色深浅直观展示反压传导链路越黑说明反压越严重[8]数据源消费 Lag 暴涨如果上游是Kafka这类消息队列会看到消费组的生产/消费差值Lag持续上涨明明消费任务没停就是追不上数据生产的速度处理延迟飙升原本处理一条数据只要几毫秒现在要几秒甚至更久端到端的处理延迟越来越高作业报错/不稳定严重的时候TaskManager会日志报错「缓冲区耗尽」甚至作业直接崩溃同时Flink用来保证数据不丢的Checkpoint定时存的作业快照会频繁超时影响数据一致性[1][4]。三、反压是怎么产生的通俗原因反压本质就是「下游处理速度跟不上上游的生产速度」常见原因有4类非常好理解某个算子太“笨”比如某个计算步骤逻辑特别复杂或者需要频繁查数据库、调外部接口处理一条数据就要几百毫秒而上游一秒能给它发几千条自然就堵了数据“偏心”数据倾斜比如你按用户ID分组处理某个大V用户的数据量占了总数据的90%所有大V的数据都堆到一个子任务里处理其他9个子任务闲得发慌这个子任务忙到冒烟自然就成了堵点[1]下游“胃口”太小比如Flink处理完的数据要写数据库、ES、Redis但是这些外部系统每秒只能扛1000条写入而Flink每秒能产10万条下游接不住自然就反压了资源不够比如给Flink分配的CPU、内存太少算个东西都卡顿或者网络带宽不够数据传输都慢也会导致处理速度上不去[1]。四、怎么解决和优化反压对症下药就行解决反压的核心逻辑是「先找堵点再对症下药」步骤非常简单第一步先定位堵在哪不用瞎猜直接看Flink的Web UI先看哪个算子标红反压基本就是堵点如果看不出来就看各个算子的「缓冲区使用率」如果某个算子的发送端缓冲区占满说明它被下游堵了如果接收端缓冲区占满说明它自己太慢堵了上游[2]。第二步对应原因解决如果是某个算子太慢先优化逻辑比如把同步查数据库改成异步调用把复杂的计算逻辑简化或者用异步I/O算子别让这个步骤卡着如果逻辑已经没法优化了就给这个算子加「人手」提高这个算子的并行度比如原来只有1个任务在处理改成8个一起干分摊压力[1]。如果是数据倾斜改分组规则比如原来只按用户ID分组现在加上「业务类型」一起做哈希分组把大V的数据拆到多个任务里处理提前预聚合在数据量大的分组逻辑之前先做个汇总比如先按用户ID算个总数再往下传减少下游要处理的数据量[1][3]。如果是下游外部系统扛不住优化下游写入逻辑比如原来一条一条写数据库改成批量攒几十条再一起写或者用异步写入大幅提高下游的吞吐量如果下游实在没法优化就在上游Source端加限流比如限制Kafka每秒最多读5万条别让数据量超过下游的承受上限先扛过流量高峰[1][5]。如果是资源不够要么加Flink的工作节点TaskManager要么给单个节点加CPU、内存还可以适当调大网络缓冲区的比例别让数据传输的「水管」太细[1]。最后补充个小知识反压本身不是坏事它是Flink的自我保护机制如果没有反压下游直接被海量数据压垮反而会导致数据丢失、作业崩溃。只有持续的高反压才需要处理核心就是让上下游的处理速度匹配上就行[4]。参考资料[1] https://blog.csdn.net/goTsHgo/article/details/142390688[2] https://www.zhihu.com/question/608209031/answer/3088321094[3] https://m.blog.csdn.net/weixin_43847900/article/details/148134999[4] https://m.blog.csdn.net/m0_57376564/article/details/147832184[5] https://m.blog.csdn.net/winterPassing/article/details/148335733[6] https://m.blog.csdn.net/weixin_43847900/article/details/148134665[7] https://developer.aliyun.com/ask/364347[8] https://developer.aliyun.com/article/948453