实时计算Flink中,定位造成反压的原因是什么?
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。
定位到反压节点后,分析造成原因的办法要结合出现反压时候实际现场情况来进行分析,主要的情况主要包含有如下的情况,包含数据倾斜,资源不足数据突增,代码性能问题,节点TM的GC问题,下游的数据源性能问题。
数据倾斜:通过 Web UI 各个 SubTask 的 Records Sent 和 Records Received 来确认,另外,还可以通过 Checkpoint detail 里不同的 SubTask 的 State Size 来判断是否数据倾斜。
代码问题:最有用的办法就是对 TaskManager 进行 CPU profile,从中我们可以分析到 Task Thread 是否跑满一个 CPU 核:如果是的话要分析 CPU 主要花费在哪些函数里面,比如我们生产环境中就偶尔遇到卡在 Regex 的用户函数(ReDoS);如果不是的话要看 Task Thread 阻塞在哪里,可能是用户函数本身有些同步的调用,可能是 checkpoint 或者 GC 等系统活动导致的暂时系统暂停。目前flink版本提供了火焰图的来分析CPU的性能瓶颈。
GC 问题分析:包括 TaskManager JVM 各区内存不合理导致的频繁 Full GC 甚至失联。推荐可以通过给 TaskManager 启用 G1 垃圾回收器来优化 GC,并加上 -XX-:+PrintGCDetails 来打印 GC 日志的方式来观察 GC 的问题。通过 GC 日志,分析出单个 Flink TaskManager 堆总大小、年轻代、老年代分配的内存空间,Full GC 后老年代剩余大小等。
数据突增资源不足:这种情况下场景一般是任务运行正常一段时间后,上游数据量出现增大的情况,导致消耗节点大量的CPU或者内存(特别是join节点)从而形成了反压,这种情况可以通过手动调大节点资源或者是使用自动调优。
下游的数据源性能:在发现Sink 端写入性能较差,sink的上游节点出现反压情况,需要结合sink的数据端性能情况是否存在问题需要提升。"
以上内容摘自《企业级云原生白皮书项目实战》电子书,点击https://developer.aliyun.com/ebook/download/7774可下载完整版