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,一经查实,立即删除!

相关文章

new/delete和malloc/free的区别一般汇总

一、基本概念 malloc/free: 1、函数原型及说明: void *malloc(long NumBytes):该函数分配了NumBytes个字节,并返回了指向这块内存的指针。如果分配失败,则返回一个空指针(NULL)。 void free(voi…

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

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

Logback日志发送到Kafka

Logback日志发送到Kafka 文章目录Logback日志发送到Kafka一、使用logback将日志发送至kafka1.1 引入依赖1.2 logback.xml简单Demo1.3 兼容性1.4 完整的样例1.5 启动程序收集日志1.6 项目Git地址一、使用logback将日志发送至kafka 1.1 引入依赖 如果存在则跳过该步骤 pom.xml …

01背包问题(DFS解法)

有5个物体,每个物品只有一个,其重量分别是为2,2,6,5,4,价值分别为6,3,5,4,6,背包的载重量为10,求装入背包的物体及总质量。 计算结果:15 package com.lanQiaoFor6;import java.util.ArrayList; import java.util.TreeSet;public class JAVA_6 {static …

Windows下安装Vim插件管理Vundle

VIM是编辑器之神,这个就不用说了,越使用越会体会到VIM的强大与便利。但是它的强大建立在众多插件组合之上,而Vim本身缺乏对插件的有效管理,安装插件并配置_vimrc文件非常不便。gmarik受到Ruby的bunler的启发,开发了vun…

AOE网

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

Spark foreachRDD的使用

常出现的使用误区: **误区一:**在driver上创建连接对象(比如网络连接或数据库连接) 如果在driver上创建连接对象,然后在RDD的算子函数内使用连接对象,那么就意味着需要将连接对象序列化后从driver传递到w…

包子凑数(蓝桥杯)

标题:包子凑数 小明几乎每天早晨都会在一家包子铺吃早餐。他发现这家包子铺有N种蒸笼,其中第i种蒸笼恰好能放Ai个包子。每种蒸笼都有非常多笼,可以认为是无限笼。 每当有顾客想买X个包子,卖包子的大叔就会迅速选出若干笼包子来&…

makefile例子(经典)

相信在unix下编程的没有不知道makefile的,刚开始学习unix平台 下的东西,了解了下makefile的制作,觉得有点东西可以记录下。   下面是一个极其简单的例子: 现在我要编译一个Hello world,需要如下三个文件:…

Scala-SparkStreaming 2.2.0 消费 kafka0.10(生产1.0)

Scala-SparkStreaming 2.2.0 kafka0.10(生产1.0) 文章目录Scala-SparkStreaming 2.2.0 kafka0.10(生产1.0)代码Pom.xmlSparkstreaming 2.1.1版本pom文件Spark 2.2 kafka0.10(api使用的0.10,实际生产kafka版本是1.0)代码…

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

[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…

hdu1232畅通路程(并查集)

参考博客&#xff1a;https://blog.csdn.net/blue_skyrim/article/details/50178287 畅通工程 Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 62854 Accepted Submission(s): 33623 Problem Description 某省调…

gcc的简单使用教程

前几天在学习嵌入式入门时,有一个视频中就是介绍gcc的使用的,看了视频后突然好 想将GCC的手册页翻译出来,后来看到手册页发现实在太多了,凭我个人的能力根本无 法完成,只能写一些自己使用Gcc时的一些常规使用方法. GCC是GNU的成员之一,原意是GNU的C语言编译器,后来发展到不只能…

SparkStreaming参数介绍

SparkStreaming参数介绍 spark.streaming.concurrentJobs :增加job并行度 可以通过集中方法为streaming job配置此参数。 - spark-default中修改 全局性修改&#xff0c;所有的streaming job都会受到影响。 - 提交streaming job是 –conf 参数添加&#xff08;推荐&#x…

还是畅通工程(克鲁斯卡尔算法+并查集)

还是畅通工程 Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 53997 Accepted Submission(s): 24504 Problem Description 某省调查乡村交通状况&#xff0c;得到的统计表中列出了任意两村庄间的距离。省政府“畅…

makefile深度学习(一个工程实例来学习 Makefile)

转自 http://www.cnblogs.com/OpenShiFt/p/4313351.html?utm_sourcetuicool&utm_mediumreferral Makefile 文件的编写 学习前的准备 需要准备的工程目录结构如下&#xff1a; . ├── add │ ├── add_float.c │ ├── add.h │ └── add_int.c ├── main…

Spark算子介绍

Spark算子 文章目录Spark算子一、转换算子coalesce函数repartition函数flatMap——flatMap变换sample——抽样zip——联结mapValues——对Value值进行变换二、行动Action算子数据运算类行动算子reduce——Reduce操作collect——收集元素countByKey——按Key值统计Key/Value型RD…

数据结构实验之二叉树六:哈夫曼编码

题目描述 字符的编码方式有多种&#xff0c;除了大家熟悉的ASCII编码&#xff0c;哈夫曼编码(Huffman Coding)也是一种编码方式&#xff0c;它是可变字长编码。该方法完全依据字符出现概率来构造出平均长度最短的编码&#xff0c;称之为最优编码。哈夫曼编码常被用于数据文件压…

hdu3790最短路径问题 (Dijkstra算法)

最短路径问题 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 32544 Accepted Submission(s): 9565Problem Description给你n个点&#xff0c;m条无向边&#xff0c;每条边都有长度d和花费p&#xff0c;给你起…

spark master web ui 端口8080被占用解决方法

spark master web ui 端口8080被占用解决方法 Spark master web ui 默认端口为8080&#xff0c;当系统有其它程序也在使用该接口时&#xff0c;启动master时也不会报错&#xff0c;spark自己会改用其它端口&#xff0c;自动端口号加1&#xff0c;但为了可以控制到指定的端口&a…