Flink调优----反压处理

目录

概述

1.1 反压的理解

1.2 反压的危害

定位反压节点

2.1 利用 Flink Web UI 定位

通过 WebUI 看到 Map 算子处于反压:​编辑

分析瓶颈算子

2.2 利用 Metrics 定位

根据指标分析反压

可以进一步分析数据传输

反压的原因及处理

3.1 查看是否数据倾斜

3.2 使用火焰图分析

开启火焰图功能

WebUI 查看火焰图

分析火焰图

3.3 分析 GC 情况

3.4 外部组件交互

总结


        在 Flink 大数据处理架构中,网络流控及反压机制犹如交通指挥系统,对于保障数据流畅通无阻、系统稳定高效运行起着至关重要的作用。当数据在 Flink 任务的各个节点间流动时,一旦出现反压现象,若不能及时察觉与妥善处理,将会如连锁反应般对整个数据处理流程产生诸多负面影响,从 checkpoint 的时长增加、状态大小膨胀,到资源的过度消耗乃至系统的崩溃瘫痪。因此,深入理解 Flink 网络流控及反压的原理、熟练掌握定位反压节点的方法以及明晰反压产生的原因与对应的处理策略,是每一位致力于优化 Flink 作业性能的开发者和运维人员的必备技能,能够帮助其在面对复杂多变的数据处理场景时,提前预防或迅速解决反压问题,确保 Flink 系统始终保持高效、稳定的运行状态,为业务提供持续可靠的数据支持与服务。

概述

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

1.1 反压的理解

        简单来说,Flink 拓扑中每个节点(Task)间的数据都以阻塞队列的方式传输,下游来不及消费导致队列被占满后,上游的生产也会被阻塞,最终导致数据源的摄入被阻塞。

        反压(BackPressure)通常产生于这样的场景:短时间的负载高峰导致系统接收数据的速率远高于它处理数据的速率。许多日常问题都会导致反压,例如,垃圾回收停顿可能会导致流入的数据快速堆积,或遇到大促、秒杀活动导致流量陡增。

1.2 反压的危害

        反压如果不能得到正确的处理,可能会影响到 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)的稳定性问题。

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

定位反压节点

        解决反压首先要做的是定位到造成反压的节点,排查的时候,先把 operator chain 禁用,方便定位到具体算子。

提交 UvDemo:

bin/flink run \
-t yarn-per-job \
-d \
-p 5 \
-Drest.flamegraph.enabled=true \
-Dyarn.application.queue=test \
-Djobmanager.memory.process.size=1024mb \
-Dtaskmanager.memory.process.size=2048mb \
-Dtaskmanager.numberOfTaskSlots=2 \
-c com.atguigu.flink.tuning.UvDemo \
/opt/module/flink-1.13.1/myjar/flink-tuning-1.0-SNAPSHOT.jar

2.1 利用 Flink Web UI 定位

        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 上通过颜色和数值来展示繁忙和反压的程度。

通过 WebUI 看到 Map 算子处于反压:

分析瓶颈算子

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

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

            下游的节点接受速率较慢,通过反压机制限制了该节点的发送速率。这种情况,需要继续排查下游节点,一直找到第一个为 OK 的一般就是根源节点。

  2. 总体来看,如果我们找到第一个出现反压的节点,反压根源要么是就这个节点,要么是它紧接着的下游节点。
  3. 通常来讲,第二种情况更常见。如果无法确定,还需要结合 Metrics 进一步判断。

2.2 利用 Metrics 定位

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

Metris描述
outPoolUsage发送端 Buffer 的使用率
inPoolUsage接收端 Buffer 的使用率
floatingBuffersUsage(1.9 以上)接收端 Floating Buffer 的使用率
exclusiveBuffersUsage(1.9 以上)接收端 Exclusive Buffer 的使用率

        其中 inPoolUsage = floatingBuffersUsage + exclusiveBuffersUsage。

根据指标分析反压

        分析反压的大致思路是:如果一个 Subtask 的发送端 Buffer 占用率很高,则表明它被下游反压限速了;如果一个 Subtask 的接受端 Buffer 占用很高,则表明它将反压传导至上游。反压情况可以根据以下表格进行对号入座 (1.9 以上):

outPoolUsage

outPoolUsage

inPoolUsage

正常

被下游反压,处于临时情况

(还没传递到上游)

可能是反压的根源,一条输入多条输出的场景

inPoolUsage

如果上游所有outPoolUsage都是低,有可能最终可能导致反压(还没传递到上游)

被下游反压

如果上游的outPoolUsage是高,则为反压根源

可以进一步分析数据传输

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

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

exclusiveBuffersUsage 低exclusiveBuffersUsage 高
floatingBuffersUsage 低
所有上游 outPoolUsage 低
正常
floatingBuffersUsage 低
上游某个 outPoolUsage 高
潜在的网络瓶颈
floatingBuffersUsage 高
所有上游 outPoolUsage 低
最终对部分 inputChannel 反压(正在传递)最终对大多数或所有 inputChannel 反压(正在传递)
floatingBuffersUsage 高
上游某个 outPoolUsage 高
只对部分 inputChannel 反压对大多数或所有 inputChannel 反压

总结:

  1. floatingBuffersUsage 为高,则表明反压正在传导至上游
  2. 同时 exclusiveBuffersUsage 为低,则表明可能有倾斜
    比如,floatingBuffersUsage 高、exclusiveBuffersUsage 低为有倾斜,因为少数 channel 占用了大部分的 Floating Buffer。

反压的原因及处理

        注意:反压可能是暂时的,可能是由于负载高峰、CheckPoint 或作业重启引起的数据积压而导致反压。如果反压是暂时的,应该忽略它。另外,请记住,断断续续的反压会影响我们分析和解决问题。

        定位到反压节点后,分析造成原因的办法主要是观察 Task Thread。按照下面的顺序,一步一步去排查。

3.1 查看是否数据倾斜

        在实践中,很多情况下的反压是由于数据倾斜造成的,这点我们可以通过 Web UI 各个 SubTask 的 Records Sent 和 Record Received 来确认,另外 Checkpoint detail 里不同 SubTask 的 State size 也是一个分析数据倾斜的有用指标。

(关于数据倾斜的详细解决方案,会在下一章节详细讨论)

3.2 使用火焰图分析

        如果不是数据倾斜,最常见的问题可能是用户代码的执行效率问题(频繁被阻塞或者性能问题),需要找到瓶颈算子中的哪部分计算逻辑消耗巨大。

        最有用的办法就是对 TaskManager 进行 CPU profile,从中我们可以分析到 Task Thread 是否跑满一个 CPU 核:如果是的话要分析 CPU 主要花费在哪些函数里面;如果不是的话要看 Task Thread 阻塞在哪里,可能是用户函数本身有些同步的调用,可能是 checkpoint 或者 GC 等系统活动导致的暂时系统暂停。

开启火焰图功能

        Flink 1.13 直接在 WebUI 提供 JVM 的 CPU 火焰图,这将大大简化性能瓶颈的分析,默认是不开启的,需要修改参数:

rest.flamegraph.enabled: true #默认 false

也可以在提交时指定:

bin/flink run \
-t yarn-per-job \
-d \
-p 5 \
-Drest.flamegraph.enabled=true \
-DYarn.application.queue=test \
-Drest.flamegraph.enabled=true \
-Djobmanager.memory.process.size=1024mb \
-Dtaskmanager.memory.process.size=2048mb \
-Dtaskmanager.numberOfTaskSlots=2 \
-c com.atguigu.flink.tuning.UvDemo \
/opt/module/flink-1.13.1/myjar/flink-tuning-1.0-SNAPSHOT.jar

WebUI 查看火焰图

        火焰图是通过对堆栈跟踪进行多次采样来构建的。每个方法调用都由一个条形表示,其中条形的长度与其在样本中出现的次数成正比。

  • On-CPU: 处于 [RUNNABLE, NEW] 状态的线程
  • Off-CPU: 处于 [TIMED_WAITING, WAITING, BLOCKED] 的线程,用于查看在样本中发现的阻塞调用。

分析火焰图

颜色没有特殊含义,具体查看:

  • 纵向是调用链,从下往上,顶部就是正在执行的函数
  • 横向是样本出现次数,可以理解为执行时长。

        看顶层的哪个函数占据的宽度最大。只要有 “平顶”(plateaus),就表示该函数可能存在性能问题。

如果是 Flink 1.13 以前的版本,可以手动做火焰图:
如何生成火焰图:如何生成 Flink 作业的交互式火焰图? | zhisheng的博客

3.3 分析 GC 情况

        TaskManager 的内存以及 GC 问题也可能会导致反压,包括 TaskManager JVM 各区内存不合理导致的频繁 Full GC 甚至失联。通常建议使用默认的 G1 垃圾回收器。

        可以通过打印 GC 日志(-XX:+PrintGCDetails),使用 GC 分析器(GCViewer 工具)来验证是否处于这种情况。

在 Flink 提交脚本中,设置 JVM 参数,打印 GC 日志:

bin/flink run \
-t yarn-per-job \
-d \
-p 5 \
-Drest.flamegraph.enabled=true \
-Denv.java.opts="-XX:+PrintGCDetails -XX:+PrintGCDateStamps" \
-DYarn.application.queue=test \
-Djobmanager.memory.process.size=1024mb \
-Dtaskmanager.memory.process.size=2048mb \
-Dtaskmanager.numberOfTaskSlots=2 \
-c com.atguigu.flink.tuning.UvDemo \
/opt/module/flink-1.13.1/myjar/flink-tuning-1.0-SNAPSHOT.jar

下载 GC 日志的方式:
        因为是 on yarn 模式,运行的节点一个一个找比较麻烦。可以打开 WebUI,选择 JobManager 或者 TaskManager,点击 Stdout,即可看到 GC 日志,点击下载按钮即可将 GC 日志通过 HTTP 的方式下载下来。

分析 GC 日志:
        通过 GC 日志分析出单个 Flink Taskmanager 堆总大小、年轻代、老年代分配的内存空间、Full GC 后老年代剩余大小等,相关指标定义可以去 Github 具体查看。
GCViewer 地址:https://github.com/chewiebug/GCViewer
Linux 下分析:

java -jar gcviewer_1.3.4.jar gc.log

Windows 下分析:
直接双击 gcviewer_1.3.4.jar,打开 GUI 界面,选择 gc 的 log 打开

扩展:

        最重要的指标是 Full GC 后,老年代剩余大小这个指标,按照《Java 性能优化权威指南》这本书 Java 堆大小计算法则,设 Full GC 后老年代剩余大小空间为 M,那么堆的大小建议 3 ~ 4 倍 M,新生代为 1 ~ 1.5 倍 M,老年代应为 2 ~ 3 倍 M。

3.4 外部组件交互

        如果发现我们的 Source 端数据读取性能比较低或者 Sink 端写入性能较差,需要检查第三方组件是否遇到瓶颈,还有就是做维表 join 时的性能问题。

例如:

  • Kafka 集群是否需要扩容,Kafka 连接器是否并行度较低
  • HBase 的 rowkey 是否遇到热点问题,是否请求处理不过来
  • ClickHouse 并发能力较弱,是否达到瓶颈

关于第三方组件的性能问题,需要结合具体的组件来分析,最常用的思路:

  1. 异步 io + 热缓存来优化读写性能
  2. 先攒批再读写

维表 join 参考:
Apache Flink学习网
维度数据实时关联的实践(w/ Flink、Vert.x & Guava Cache) - 简书

总结

        本文全面深入地探讨了 Flink 网络流控及反压相关内容。首先对反压进行了清晰的界定,明确其是由于下游消费速率跟不上上游生产速率,致使数据在节点间传输受阻而产生的现象,并阐述了其在诸如负载高峰、垃圾回收停顿、大促活动等场景下容易出现,以及对 checkpoint 时长和 state 大小可能造成的严重危害。接着详细介绍了定位反压节点的两大有效途径,一是借助 Flink Web UI,通过其反压监控功能在不同版本下对 SubTask 级别的反压状态进行判断,并依据相关频率或颜色数值信息确定反压程度,同时结合对瓶颈算子的分析思路进一步排查;二是利用 Metrics,主要依据与 Channel 接受端 Buffer 使用率相关的指标,如 outPoolUsage、inPoolUsage 等,通过分析这些指标的不同组合情况精准定位反压的位置与传导方向。在反压原因及处理方面,依次从数据倾斜、火焰图分析、GC 情况以及外部组件交互等多个维度展开论述。通过 Web UI 查看 SubTask 的 Records Sent 和 Record Received 以及 Checkpoint detail 里的 State size 可判断是否数据倾斜;利用 Flink 1.13 及以上版本在 WebUI 提供的 JVM CPU 火焰图或手动生成火焰图(1.13 以前版本)来分析用户代码执行效率问题;通过打印 GC 日志并借助 GCViewer 工具分析 TaskManager 的内存与 GC 问题;针对 Source 端或 Sink 端与第三方组件交互时出现的性能问题,如 Kafka 集群、HBase、ClickHouse 等,提出了异步 io + 热缓存、先攒批再读写等常用优化思路以及维表 join 的参考方案。通过对这些内容的深入研究与实践应用,能够有效提升 Flink 作业在网络流控及反压处理方面的能力,确保系统在复杂数据处理环境下的稳定性与高效性,为大数据处理任务的顺利完成奠定坚实基础。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/495550.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

RabbitMQ工作模式(详解 工作模式:简单队列、工作队列、公平分发以及消息应答和消息持久化)

文章目录 十.RabbitMQ10.1 简单队列实现10.2 Work 模式(工作队列)10.3 公平分发10.4 RabbitMQ 消息应答与消息持久化消息应答概念配置 消息持久化概念配置 十.RabbitMQ 10.1 简单队列实现 简单队列通常指的是一个基本的消息队列,它可以用于…

追风赶月莫停留,平芜尽处是春山—记一次备考经历(下)

追风赶月莫停留,平芜尽处是春山—记一次备考经历(上) 上篇是对政治、英语、专业的总结,这篇是对数学的总结。 数学二-高数 从之前考试得出的结论“得数学者得天下”,所以特别重视数学,70%的时间都用在了…

【设备 磁盘】重要备份存放U盘的风险 + winhex 磁盘清零(清理windows无法格式化的磁盘)

简述 清理用设备管理器和DiskGenious无法打开的磁盘 winhex安装 官网https://www.x-ways.net/winhex/下载,解压后以管理员身份运行 注意:非完全版不能像磁盘写入编辑后的数据 使用 解压后直接点击打开即可 打开磁盘 “全选”后,选择…

虚幻引擎是什么?

Unreal Engine,是一款由Epic Games开发的游戏引擎。该引擎主要是为了开发第一人称射击游戏而设计,但现在已经被成功地应用于开发模拟游戏、恐怖游戏、角色扮演游戏等多种不同类型的游戏。虚幻引擎除了被用于开发游戏,现在也用于电影的虚拟制片…

CI/CD是什么?

CI/CD 定义 CI/CD 代表持续集成和持续部署(或持续交付)。它是一套实践和工具,旨在通过自动化构建、测试和部署来改进软件开发流程,使您能够更快、更可靠地交付代码更改。 持续集成 (CI):在共享存储库中自动构建、测试…

LabVIEW软件开发的未来趋势

LabVIEW软件开发的未来趋势可以从以下几个方面来分析: ​ 1. 与AI和机器学习的深度结合 趋势:LabVIEW正在向集成AI和机器学习方向发展,尤其是在数据处理、预测性维护和自动化控制领域。 原因:AI技术的普及使得实验和工业场景中的…

Ruby+Selenium教程

什么是 Minitest? Minitest 是 Ruby 的测试框架,提供一整套测试工具。它运行速度快,支持 TDD、BDD、模拟和基准测试 以下是使用Ruby、Selenium WebDriver和Minitest 的脚本,用于断言 Restful Booker Platform 的“页面标题”等于…

【Select 语法全解密】.NET开源ORM框架 SqlSugar 系列

系列文章目录 🎀🎀🎀 .NET开源 ORM 框架 SqlSugar 系列 🎀🎀🎀 文章目录 系列文章目录前言一、Select 执行位置二、返回一个字段和多个字段三、单表返回DTO四、多表返回DTO4.1 手动DTO4.2 实体自动映射14.…

stm32基础(keil创建、Proteus仿真、点亮LED灯,7段数码管)

一、keil的创建 随后点击新建(Ctrln),接着保存到所自己项目工程文件。.c .h都是这样操作 二、Proteus的简单使用 左上角框框内可以拖动 三、点亮LED灯代码 led.c #include "stm32f10x.h" // Device headervoid led_init(…

细说STM32F407单片机轮询方式读写SPI FLASH W25Q16BV

目录 一、工程配置 1、时钟、DEBUG 2、GPIO 3、SPI2 4、USART6 5、NVIC 二、软件设计 1、FALSH (1)w25flash.h (2) w25flash.c 1)W25Q16基本操作指令 2)计算地址的辅助功能函数 3)器…

sentinel笔记9- 限流规则持久化(上)

之前的在sentinel 控制台配置的规则&#xff0c;重启后就消失了&#xff0c;sentinel 限流保护-笔记-CSDN博客 本篇还是在之前的demo做验证&#xff0c;使用nacos做持久化。 规则集成Nacos 1 引入依赖 <!--nacos-discovery 注册中心依赖--><dependency><gr…

RPA系列-uipath 学习笔记3

用uipath读取excel填写表单 所有素材都搬运自uipath academy 读取数据 现在手头上有这样一份数据 需要按行依次把数据填入到浏览器中的表单中&#xff0c;首先创建一个空的process 在activity中拉入excel process scope,同时在里面点击use_excel_file,选择你要使用的file,并…

强力巨彩租赁屏技术更新,适用多种户外应用场景

现代社会&#xff0c;户外广告和活动展示是商家吸引公众注意力的主要方式之一。在这场视觉盛宴的背后&#xff0c;一款高效、稳定且适应性强的LED显示屏在其中扮演着重要角色。强力巨彩幻云户外HY3.9 H单边斜角底壳租赁屏是一款专为户外创意应用场景量身打造的LED显示屏产品&am…

SpringCloud 系列教程:微服务的未来(二)Mybatis-Plus的条件构造器、自定义SQL、Service接口基本用法

本篇博客将深入探讨 MyBatis-Plus 的三个核心功能&#xff1a;条件构造器、自定义 SQL 和 Service 接口的基本用法。通过对这些功能的学习和掌握&#xff0c;开发者能够更加高效地使用 MyBatis-Plus 进行业务开发。 目录 前言 条件构造器 自定义SQL Service接口基本用法 总结…

vue中proxy代理配置(测试一)

接口地址&#xff1a;http://jsonplaceholder.typicode.com/posts 1、配置一&#xff08;代理没起作用&#xff09; &#xff08;1&#xff09;设置baseURL为http://jsonplaceholder.typicode.com &#xff08;2&#xff09;proxy为 ‘/api’&#xff1a;’ ’ &#xff08;3&a…

Element-ui的使用教程 基于HBuilder X

文章目录 1.Element-ui简介2.使用HBuilderX 创建一个基于Vue3的项目 &#xff08;由于是使用的基于Vue3的Element-ui&#xff09;3.安装element-ui4.在项目里完全引用element-ui5.引用组件6.运行项目 1.Element-ui简介 Element&#xff0c;一套为开发者、设计师和产品经理准备…

C语言从入门到放弃教程

C语言从入门到放弃 1. 介绍1.1 特点1.2 历史与发展1.3 应用领域 2. 安装2.1 编译器安装2.2 编辑器安装 3. 第一个程序1. 包含头文件2. 主函数定义3. 打印语句4. 返回值 4. 基础语法4.1 注释4.1.1 单行注释4.1.2 多行注释 4.2 关键字4.2.1 C语言标准4.2.2 C89/C90关键字&#xf…

Python OCR 文字识别

一.引言 文字识别&#xff0c;也称为光学字符识别&#xff08;Optical Character Recognition, OCR&#xff09;&#xff0c;是一种将不同形式的文档&#xff08;如扫描的纸质文档、PDF文件或数字相机拍摄的图片&#xff09;中的文字转换成可编辑和可搜索的数据的技术。随着技…

LeetCode:257. 二叉树的所有路径

跟着carl学算法&#xff0c;本系列博客仅做个人记录&#xff0c;建议大家都去看carl本人的博客&#xff0c;写的真的很好的&#xff01; 代码随想录 LeetCode&#xff1a;257. 二叉树的所有路径 给你一个二叉树的根节点 root &#xff0c;按 任意顺序 &#xff0c;返回所有从根…

C++----------类的设计

二维点的表示&#xff08;类设计&#xff09; 知识点讲解&#xff1a; 封装&#xff1a;将数据成员&#xff08;x和y坐标&#xff09;设为private&#xff0c;这遵循了面向对象编程中的封装原则&#xff0c;防止外部代码随意修改类内部的数据&#xff0c;保证数据的安全性和完整…