BackPressure详细介绍

BackPressure详细介绍

文章目录

  • BackPressure详细介绍
    • 前言
    • 什么是反压?
    • 为什么需要关注反压?
    • 为什么不需要关注反压?
    • 如何发现和追踪反压的根源?
    • 反压的坏处
    • 经常碰到哪些问题会任务反压
    • 怎么处理反压?

前言

Flink反压已经是老生常谈的问题。那么如何确定反压的根源呢?在最近的Flink发布版本情况发生了很大的变化(特别是在Flink 1.13中增加了新的度量和web UI)。这篇文章将试图澄清其中的一些变化,并详细介绍如何追踪反压的根源。

什么是反压?

概括来说,反压就是Job Graph中的某些operator处理数据的速率低于接收数据的速率,造成数据积压,积压的数据填充到这些operator子任务的输入缓冲区。一旦输入缓冲区满了,反压就会传播到上游子任务的输出缓冲区。上游子任务也会被迫降低自身数据处理速度,以匹配下游opeartor的处理速度。由此类推,反压一步一步向上游传递,直至到达数据源operator端。

为什么需要关注反压?

反压是服务器或者operator过载的表现。因为数据在被处理之前已经在队列等待很长时间。所以,反压将直接影响系统的端到端延迟。另外,反压将导致对齐的检查点需要更长的时间,也将导致未对齐的检查点越来越大。如果你正在经历检查点障碍问题,关注反压将有助于解决问题。哪怕你只是想优化Flink作业,以降低运行成本,关注反压也很有必要。总之,为了解决的问题,你需要了解它,然后定位和分析它。

为什么不需要关注反压?

坦率地说,也不必太过于关注反压。从定义上来说,一直没有反压,说明集群资源利用率低。如果你想最大限度地减少闲置资源,允许一些反压现象的存在也是合理的,尤其对于批处理作业。

如何发现和追踪反压的根源?

利用metrics可以发现反压现象。不过,从Flink1.13版本开始,通过job graph可以直观的发现是否存在反压的现象,不需要点击进入task内部查看。

如上图示例,不同task有不同的颜色。通过颜色反映两方面信息:task反压程度、task忙碌程度。空闲task颜色为蓝色,全负荷忙碌task颜色为红色,反压全负荷task颜色直接置为黑色。通过这些颜色,可以很容易的发现反压task(黑)、busy task(红)。反压task下游的busy task很可能是反压的根源。

单独点击进入特定task的BackPressure页签,可以更直观的剖析反压问题,检查该task每个subtask的busy/backpressure/idle状态。比如,如果存在数据倾斜,每个subtask资源将不能得到同等的利用。

在这里插入图片描述

如上图示例,可以很清晰看出哪些subtask空闲、哪些subtask反压、没有subtask繁忙。坦率的说,以上足够定位反压问题了。不过,还有几个细节值得解释。BackPressured/Idle/Busy数据是基于三个新增metrics:

metrics(idleTimeMsPerSecond、

busyTimeMsPerSecond、

backPressuredTimeMsPerSecond)

由subtask计算和提供的。与CPU使用率指标非常相似,这三项数据用于测量每秒内有多少毫秒分别处于空闲、繁忙、反压。除了一些四舍五入误差外,三项数据是相互补充的,总和必须等于1000ms/s。另一个重要细节:三项数据是短时间内(几秒内)平均值,所反映的是subtask内部所有信息:

operators、functions、timers、checkpoint、序列化反序列化、网络堆栈、其他Flink内部开销。如果WindowOperator忙于启动定时器并生成结果,将会报告为busy或backpressure。如果Checkpointed接口类snapshotState方法存在复杂计算任务(如刷新内部缓冲区),也将会报告为busy。

值得一提的是,这里有一个限制:busyTimeMsPerSecond、idleTimeMsPerSecond对于subtask之外线程是不敏感的。存在如下两种场景:Operators内部自定义线程(该做法是官方不推荐的);使用已经不推荐的SourceFunction接口,该类source的busyTimeMsPerSecond数据将报告为NaN/N/A。

在这里插入图片描述

由于三项数据是几秒内测量的平均值。所以,在分析动态负载(varying load)类型的jobs或tasks(如subtask有定期触发的WindowOperator)时,一定要记住一点:恒定负载50%的subtask和每秒在fullBusy与fullIdle之间切换的subtask,busyTimeMsPerSecond数据均是500ms/s。

此外,动态负载(varying load)类型的jobs或tasks,尤其是触发窗口时,会将性能瓶颈移动到job graph的其他位置。

在这里插入图片描述

在这里插入图片描述

如上示例,SlidingWindowOperator因为积累数据成为性能瓶颈。但是,一旦触发窗口计算(10秒一次),下游task(SlidingWindowCheckMapper-> Sink: SlidingWindowCheckPrintSink)就会成为瓶颈,SlidingWindowOperator出现反压。由于三项数据平均时间超过几秒钟,这种微妙之处并不是立即可见的,需要仔细观察。更重要的是,webUI每10秒只更新一次状态,使得这种现象更不容易察觉。

反压的坏处

  1. 任务处理性能出现瓶颈:以消费 Kafka 为例,大概率会出现消费 Kafka Lag。
  2. Checkpoint 时间长或者失败:因为某些反压会导致 barrier 需要花很长时间才能对齐,任务稳定性差。
  3. 整个任务完全卡住。比如在 TUMBLE 窗口算子的任务中,反压后可能会导致下游算子的 input pool 和上游算子的 output pool 满了,这时候如果下游窗口的 watermark 一直对不齐,窗口触发不了计算的话,下游算子就永远无法触发窗口计算了。整个任务卡住。

经常碰到哪些问题会任务反压

总结就是:算子的 sub-task 需要处理的数据量 > 能够处理的数据量。一般会实际中会有以下两种问题会导致反压。

  1. 数据倾斜:当前算子的每个 sub-task 只能处理 1w qps 的数据,而由于数据倾斜,这个算子的其中一些 sub-task 平均算下来 1s 需要处理 2w 条数据,但是实际只能处理 1w 条,从而反压。比如有时候 keyby 的 key 设置的不合理。
  2. 算子性能问题:下游整个整个算子 sub-task 的处理性能差,输入是 1w qps,当前算子的 sub-task 算下来平均只能处理 1k qps,因此就有反压的情况。比如算子需要访问外部接口,访问外部接口耗时长。

怎么处理反压?

首先需要分析导致反压的原因:

  1. 确认反压真实存在。

  2. 找出具体的机器或者subtask、剖析代码确定具体位置、确定哪些资源是稀缺的。

  3. 在极少数情况下,网络交换可能是job的性能瓶颈,表现为下游task输入缓冲区为空、而上游的输出缓冲区为满。

简言之,有两种处理方法:

  1. 增加资源(更多机器、更快的CPU、更好的RAM、更好的网络、使用SSD等等)。
  2. 进行优化以充分利用现有资源(优化代码、调优参数、避免数据倾斜)。

转载自:https://cdn.modb.pro/db/128767

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

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

相关文章

给IT新人的15个建议:程序员的辛酸反省与总结!

很多人表面上看着老实巴交的,实际上内心比谁都好强、自负、虚荣、甚至阴险。工作中见的多了,也就习惯了。   有一些人,什么事都写在脸上,表面上经常得罪人,甚至让人讨厌。但是他们所表现的又未必不是真性情。 我相信…

AOE网

博客来源:http://blog.csdn.net/wang379275614/article/details/13990163 认识AOE网 有向图中,用顶点表示活动,用有向边表示活动之间开始的先后顺序,则称这种有向图为AOV网络;AOV网络可以反应任务完成的先后顺序&#…

数据结构前缀,后缀,中缀表达式

[cpp] view plaincopy [cpp] view plaincopy <span style"color: rgb(51, 51, 51); font-family: Arial; font-size: 14px; line-height: 26px; background-color: rgb(255, 255, 255);">举例&#xff1a;</span> (3 4) 5 - 6 就是中缀表达式 - 3…

priority_queueint,vectorint,greaterint优先队列,按照从小到大

原网址&#xff1a; 优先队列 C优先队列的基本使用方法 在优先队列中&#xff0c;优先级高的元素先出队列。 标准库默认使用元素类型的<操作符来确定它们之间的优先级关系。 优先队列的第一种用法&#xff0c;也是最常用的用法&#xff1a; priority_queue<int>qi;通…

Spark stage如何划分

窄依赖和宽依赖 窄依赖&#xff1a; 指父RDD的每一个分区最多被一个子RDD的分区所用&#xff0c;表现为一个父RDD的分区对应于一个子RDD的分区&#xff0c;和两个父RDD的分区对应于一个子RDD 的分区。图中&#xff0c;map/filter和union属于第一类&#xff0c;对输入进行协同…

引出发射和什么是反射和Class类和Class实例、基本类型的字节码对象

引出发射和什么是反射 问题1: 1.对象有编译类型和运行类型Object obj new java.util.Date();编译类型: Object运行类型: java.util.Date需求:通过obj对象,调用java.util.Date类中的toLocaleString方法.obj.toLocaleString(); 此时编译报错, 编译时,会检查该编译类型中是…

获取类中的构造器

需求:通过反射来获取某一个类的构造器: 1):获取该类的字节码对象. 2):从该字节码对象中去找需要获取的构造器. ------------------------------------------------------------------------ Class类获取构造器方法: Constructor类:表示类中构造器的类型,Constructor的实例…

Maxwell读取MySQL数据

文章目录Maxwell 概述1.1 Maxwell 定义1.2 Maxwell工作原理1.2.1 MySQL主从复制过程1.2.2 Maxwell的工作原理1.2.3 **MySQL** **的** binlog1.3 Maxwell和Canal的对比Maxwell使用2.1 Maxwell安装2.1.1 安装地址2.1.2 安装部署2.1.3 MySQL环境准备2.1.4 初始化Maxwell元数据库2.…

Linux-(C/C++)动态链接库生成以及使用(libxxx.so)

Linux中so文件为共享库&#xff0c;与windows下dll类似&#xff0c;不过实现要简单。 so可以供多个进程使用&#xff0c;不同进程调用同一个so文件&#xff0c;所使用so文件不同。 so文件源程序不需要main函数&#xff0c;有也不会被执行。 下面通过一个简单例子&#xff0c;来…

IO之打印流

打印流,打印数据的,打印流只能是输出流: PrintStream: 字节打印流 PrintWriter: 字符打印流 -对于PrintWriter来说,当启用字段刷新之后, 调用println或者printf或者format方法,便会立马刷新操作. 如果没有开启自动刷新,则需要手动刷新或者当缓冲区满的时候,再自动刷新. 使…

IO之 Properties类加载文件

配置文件:资源文件(以.properties作为拓展名的文件)/属性文件: 做项目开发,为何使用配置文件? 把所有的数据存储在代码中,写死了,”硬编码”. 比如:在Java中需要连接数据库,必须拥有数据的账号和密码. 此时我们就得在Java代码中编写,类似的代码: String username”root”…

IO之数据流

数据流,提供了可以读/写任意数据类型的方法: DataOutputStream: 提供了 writeXxx(xxx value)方法. DataInputStream: 提供了 readXxx()方法. 注意: writeXxx和readXxx必须要对应起来, writeByte写出的数据,此时只能使用readByte读取回来.

可视化的状态机(FSM)

状态机这个概念已经在网上的博客和论坛中都已经说烂了&#xff0c;随便一搜都有一大堆。相关的废话就不多说了&#xff0c;在这里主要是分享一下如何可视化的设计状态机&#xff0c;如何增强项目的灵活性。这里通过一个生活中的电梯来了解一下状态机。 电梯逻辑如下图&#xf…

IO之 随机访问文件(RandomAccessFile)

随机访问文件(RandomAccessFile): 表示可以在该文件的任何位置写出和读取数据. API中文解释&#xff1a; 此类的实例支持对随机访问文件的读取和写入。随机访问文件的行为类似存储在文件系统中的一个大型 byte 数组。存在指向该隐含数组的光标或索引&#xff0c;称为文件指针&…

IO之 管道流

管道流: 实现两个线程之间的数据交互. PipedInputStream PipedOutputStream PipedReder PipedWriter 中文API解释&#xff1a; PipedInputStream public class PipedInputStreamextends InputStream管道输入流应该连接到管道输出流&#xff1b;管道输入流提供要写入管道输出流的…

AOE网上的关键路径

题目描述 一个无环的有向图称为无环图&#xff08;Directed Acyclic Graph&#xff09;&#xff0c;简称DAG图。 AOE(Activity On Edge)网&#xff1a;顾名思义&#xff0c;用边表示活动的网&#xff0c;当然它也是DAG。与AOV不同&#xff0c;活动都表示在了边上&#xff…

IO之NIO

NIO:New IO: 从JDK1.4开始提出的,新的IO,可以把一块磁盘文件映射到内存中,我们再去读取内存中的数据. 存放在java.nio包中. Java NIO&#xff08;New IO&#xff09;是从Java 1.4版本开始引入的一个新的IO API&#xff0c;可以替代标准的Java IO API 现在主要运用于服务器中…

IO流总结

四大基流: InputStream—- OutputStream Reader —- Writer IO流的总结和梳理: 文件流: FileInputStream FileOutputStream FileReader FileWriter 缓冲流: BufferedInputStream BufferedOutputStream BufferedReader BufferedWriter 转换流(把字节转换为字符): …

C++异常处理类与自定义异常处理类

转自&#xff1a;http://blog.csdn.net/makenothing/article/details/43273137 例1&#xff1a;自定义一个继承自excepton的异常类myException C标准中&#xff0c;定义在<stdexcept>中的任何异常类都派生自exception Class&#xff0c;本例也只是简单地由exception继承&…

网络编程概念总结

计算机网路: 计算机网络&#xff0c;是指将地理位置不同的具有独立功能的多台计算机及其外部设备&#xff0c;通过通信线路连接起来&#xff0c;在网络操作系统&#xff0c;网络管理软件及网络通信协议的管理和协调下&#xff0c;实现资源共享和信息传递的计算机系统。 从逻辑…