暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

Flink背压过高异常分析指引

IT那活儿 2024-10-21
281

点击上方“IT那活儿”公众号--专注于企业全栈运维技术分享,不管IT什么活儿,干就完了!!!


flink背压过高产生的原因

Flink 拓扑中每个节点(Task)间的数据都以阻塞队列的方式传输,下游来不及消费导致队列被占满后,上游的生产也会被阻塞,最终导致数据源的摄入被阻塞。
背压通常产生于这样的场景:

短时间的负载高峰导致系统接收数据的速率远高于它处理数据的速率。一个flink任务由多个oprators组成,由于flink的机制,无论哪个环节出现了问题,最终都会反压导致source的背压变高。


flink背压过高的危害

通过上面的简单介绍了解到背压产生的原因,如果不能得到正确的处理,可能会影响到 checkpoint 时长和 state 大小,甚至可能会导致资源耗尽甚至系统崩溃。
Flink背压过高会带来多方面的危害,‌主要体现在以下几个方面:
  • 系统性能下降
    ‌背压导致数据阻塞,‌进而造成系统吞吐量降低和延迟增大,‌影响整体处理效率。‌
  • 内存压力增大‌
    ‌大量未处理的数据会堆积在网络层或内存中,‌占用计算节点的内存资源,‌可能导致内存溢出。‌
  • 系统稳定性下降
    ‌严重的背压可能导致任务执行过程中节点由于内存溢出等问题而崩溃,‌进而影响任务的正常运行。‌
  • 影响Checkpoint机制
    ‌背压可能导致Checkpoint超时失败,‌进而影响状态数据的保存和恢复。‌
  • 影响数据一致性

    ‌如果上游是Kafka数据源,‌在一致性的要求下,‌背压可能导致offset提交不上,‌进而影响数据的一致性。‌‌


flink背压过高定位

要理清到底是哪个环节除了问题,需要持续地监控某个可以oprator的指标,例如inPoolUsage和outPoolUsage。这两个分别代表进来数据缓存的pool使用率和出去数据缓存pool的使用率,一旦inPoolUsage升高而且outPoolUsage没有明显升高,说明当前oprator存在问题。
解决背压一般从如下几个方面排查:
3.1 利用 Flink Web UI 定位
Flink Web UI 提供了 SubTask 级别的背压监控:
  • 通过颜色和数值来展示繁忙和压力的程度;
  • 通过UI进入jobs查看SubTask的Records Sent 和 Record Received 项确认是否存在数据倾斜,存在倾斜也会导致背压过高问题;
  • 再通过BackPressure确认是否背压过高,过高状态为“HIGH”,该方式可快速确定是否存在背压高的情况。
3.2 系统资源
系统资源问题包含CPU、内存、网络、diskio等等方面的优化,比较复杂。通常可以通过优化代码、降低IO、增加并行度或集群等方法解决。
3.3 GC
可以通过XX:+PrintGCDetails打印调试信息查看是否GC过多影响性能导致背压变大,然后针对性解决GC频繁的问题。
3.4 线程瓶颈
某些特别繁忙的线程也可能成为瓶颈,例如在一个48核机器上某个特别繁忙的线程可能仅仅导致2%的CPU使用率,比较不容易被发现,可以通过命令查看所有线程的cpu使用情况:
top -H -p pid
(一般是YarnTaskExecutorRunner进程的pid.)

END


本文作者:曹安匀(上海新炬中北团队)

本文来源:“IT那活儿”公众号

文章转载自IT那活儿,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论