Flink反压排查及解决方案

一、Flink反压


1、反压的理解


处理速度小于生产速度,然后数据逐级向上游进行传递阻塞,最后传到source端。

2、反压的危害


数据积压导致网络延迟越来越高,影响到checkpoint 时长和 state 大小,导致资源耗尽甚至系统崩溃。

3、反压的定位


最早通过Flink的监控框架prometheus(监控)+grafana(可视化、配置告警)发现反压。 ​ 然后先把operator chain禁用,方便定位到具体算子。利用 Flink Web UI 定位,通过查看subtask的反压监控,反压状态为HIGH红色的subtask即处于反压。 ​ 还可以利用Metrics定位,根据指标分析反压,进一步分析数据传输。

4、反压算子的分析


原因一:该节点的发送速率跟不上它的生产速率。(例如:flatmap)那么该节点是反压的根源节点。 ​ 原因二:下游的节点接受速率较慢,通过反压机制限制了该节点的发送速率。此时需要继续排查下游节点,一直找到第一个为OK的一般就是根源节点。(比较常见)

5、反压的原因和处理


如果通过Flink Web UI查看subtask的反压情况有红有绿 ----> 原因:数据倾斜。

如果通过Flink Web UI查看subtask的反压情况为全红: ​ 原因一:算子内部与第三方数据库交互。---->解决方法:旁路缓存+异步IO ​ 原因二:没有交互,是由于资源不足。----> 解决方法:加资源(内存 --> 分析GC情况、CPU -->使用火焰图分析)

二、Flink数据倾斜


1、问题发现


发现一:通过Flink Web UI 可以精确得看到每个Subtask处理的数据量,来判断Flink任务是否存在数据倾斜。 ​ 发现二:通过Flink Web UI查看任务的反压情况,如果只有个别Subtask呈现反压情况,有红有绿,可以推断出数据倾斜。

2、分析解决


情况一:keyby前数据倾斜。 ​ 原因:从source数据源读取到的数据本身就是倾斜的。 ​ 解决:消费到数据以后调用rebalance进行重分区将数据均匀分配。

情况二:keyby后数据倾斜。 ​ 解决: ​ 方法一:直接聚合。 ​ 通过状态+定时器进行预聚合(时效性会降低)。 ​ 方法二:开窗聚合。 ​ 加随机数打散实现双重聚合。 ​ 第一阶段聚合:key拼接随机数进行keyby、开窗、聚合 ​ 第二阶段聚合:key拼接窗口信息进行keyby、聚合

三、Flink SQL优化


1、设置空闲状态保留时间


使用到状态的时候就需要考虑这个状态能不能删,什么时候删,防止出现状态爆炸。

2、开启MiniBatch微批处理


先缓存一定的数据后再触发处理,以减少对State的访问,从而提升吞吐量并减少数据的输出量。 ​ 设置参数:开启MiniBatch,设置批量输出的间隔时间,设置每个批次最多缓存数据的条数(可以设置为两万条)。

3、开启LocalGlobal


即提前进行预聚合。LocalGlobal优化需要先开启MiniBatch。开启LocalGlobal需要UDAF实现Merge方法。

4、开启Split Distinct


要结合MiniBatch一起使用。 ​ 设置参数:开启Split Distinct,设置第一层打散的bucket数目。默认1024。

5、多维DISTINCT使用Filter


                        
原文链接:https://blog.csdn.net/2302_76749443/article/details/134250267

  • 8
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Flink中,反压(Backpressure)是指当数据生产速度超过数据消费速度时,消费端不能及时处理全部数据,导致未处理的数据在系统中积压,从而影响系统的性能和稳定性。如果Flink应用程序中存在反压问题,可以通过以下几个步骤来进行排查和解决: 1. 监控Flink任务的运行状态。可以通过Flink的Web界面或者JMX监控工具来查看任务的运行状态、吞吐量、延迟等指标,从而了解是否存在反压问题。 2. 调整Flink任务的并行度。如果任务的并行度过低,可能会导致某些算子的处理速度过慢,从而引起反压问题。可以通过增加算子的并行度或者调整任务的并行度来缓解反压问题。 3. 调整算子的处理逻辑。如果算子的处理逻辑过于复杂或者存在性能瓶颈,可能会导致算子处理速度过慢,从而引起反压问题。可以通过优化算子的处理逻辑、使用异步IO等方式来提高算子的处理速度。 4. 使用Flink反压机制。Flink提供了反压机制来解决反压问题,可以通过设置ExecutionConfig.setAutoWatermarkInterval()方法来开启反压机制。反压机制会根据算子的处理速度来自动调整生产数据的速度,从而避免数据积压和反压问题。 5. 使用Flink的流控机制。Flink还提供了流控机制来限制数据的生产和消费速度,从而避免反压问题。可以通过设置ExecutionConfig.setLatencyTrackingInterval()方法来开启流控机制。流控机制会根据数据的延迟来调整生产和消费数据的速度,从而保证系统的稳定性和性能。 通过以上几个步骤可以排查和解决Flink应用程序中的反压问题。需要注意的是,反压问题是一个非常常见的问题,需要在设计和编写Flink应用程序时充分考虑并发和性能问题,从而避免反压问题的出现。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值