【Flink】浅谈Flink背压问题(1)

news/2023/6/7 23:46:36

概述

在多线程的情况下有一个典型的模,型生产者消费者模型,该模型主要由生产者、消费者和一个大小固定的队列组成。生产者向队列发送数据,消费者从队列中取出数据并处理。

生产者消费者模型

针对上述模型,如果队列属于有限长度,当消费者能力<生产者能力的时候就会出现数据堆积,这样生产者的生产就会停止。现在将这个模型引入Flink算子链中,生产者和消费者的身份是相对的,一个生产者是上游的消费者,一个消费者同样也是下游的生产者。所以一个节点模型中消费者的堵塞将会向上移动,直到源头,这就是反压。

Flink数据通信模型

假如一个Flink任务(Job)中有 TaskA,TaskB,并发度都是 4,即 A1-A4,B1-B4。TaskA 与 TaskB 使用 keyby 连接。将这个 Flink Job 部署到 2 个 TM 中,每个 TM 分配 2 个 slots。那么Flink会将 A1,A2,B1,B2A1,A2,B1,B2A1,A2,B1,B2 放到一个 TM 中,A3,A4,B3,B4A3,A4,B3,B4A3,A4,B3,B4 放到一个 TM 中,具体示例如下图所示:

同一个 TM 中的SubTask采用 【local 】方式进行数据传输。位于不同 TM 的 SubTask采用【remote】方式传输。传输示意图如下图所示:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-FDG7JBd6-1674134045215)(E:/Postgraduate/document/ASSESTS/%E3%80%90Flink%E3%80%91%E6%B5%85%E8%B0%88Flink%E8%83%8C%E5%8E%8B%E9%97%AE%E9%A2%98%EF%BC%881%EF%BC%89.assets/Flink-FlinkTM%E9%80%9A%E4%BF%A1%E6%A8%A1%E5%9E%8B%E6%80%BB%E7%BB%93_image_2.png)]

我们从上图可以看出,以SubTaskA1为例,其数据传输步骤如下:

  1. TaskA1 先通过 【RecordWriter】对象将数据序列化写到一个 【Output Queue Buffer】 中(下游的并行子任务个数就是队列的个数)。
  2. 由【 Netty Service 】进行拉取,满足以下任意一个条件都会进行拉取;
    1. 【Output Queue Buffer】 写满了(默认 32KB);
    2. 【Output Queue Buffer】 超时了(默认 100ms);
    3. 遇到特殊结构,例如 Barrier,WaterMark;
  3. 经过网络传输之后,数据会写到 TaskB3 中的 【Input Queue】 中,然后由 【RecordReader】对象将数据反序列化后进行处理。

也就是说一个 下游TM 中的并行子任务出现消费延迟,就会阻塞 TCP-channel 进而影响整个 TM 的消费,最终向上传递,导致反压。

反压的监控

Web UI

可以直接在 Flink Web 中进行观察,Flink检测会针对任何一个 Task 做反压检测。该机制需要在 Flink Web 上手动触发,触发后TM 使用 Thread.GetStackTrace 来抽样检测 Task Thread 是否在 NetworkBuffer 中,即是否处于等待状态。根据抽样比例,来判断反压状态。Ratio 是代表抽样 n 次(默认100次)中,遇到等待次数的比例。

  • OK:ratio≤0.1;
  • LOW:0.01≤Ratio≤0.5;
  • High:0.5≤Ratio≤1;

从 Sink→Source 进行检查,第一个反压状态处于 High 的 task 大概率是反压的根源。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-s6HnrF2y-1674134045216)(E:/Postgraduate/document/ASSESTS/%E3%80%90Flink%E3%80%91%E6%B5%85%E8%B0%88Flink%E8%83%8C%E5%8E%8B%E9%97%AE%E9%A2%98%EF%BC%881%EF%BC%89.assets/Pasted%20image%2020220825113135.png)]

该方法有一定的缺陷:

  1. 由于他是抽样,无法观察到历史数据;
  2. 影响作业流程;
  3. 高并发场景下,需要等待很久才能检测成功;

Flink Network Metric

在上文提到过,TM之间的通信都会使用到 InputQueue 和 OutputQueue,我们可以通过使用【InputQueueUsage】 和 【OutputQueueUsage】这两个指标来判断出现反压的位置。

Task StatusOutputQueueUsage < 1.0OutputQueueUsage == 1.0
InputQueueUsage < 1.0正常处于反压,其根本原因可能是该 Task 下游处理能力不足导致,持续下去,该 Task 将会向上游传递反压
InputQueueUsage == 1.0处于反压,持续下去,该 Task 会向上游传递反压,而且该 Task 可能是反压的源头处于反压,原因可能是被下游阻塞

现在看一个实际的例子

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-9yh1MbN5-1674134045216)(E:/Postgraduate/document/ASSESTS/%E3%80%90Flink%E3%80%91%E6%B5%85%E8%B0%88Flink%E8%83%8C%E5%8E%8B%E9%97%AE%E9%A2%98%EF%BC%881%EF%BC%89.assets/Pasted%20image%2020220825114331.png)]

从指标监控界面可以看出 FlatMap→Reduce 出现了阻塞,再看 reduce 任务的 inpoolusageoutpoolusage 指标,得出结论reduce任务就是反压的源头。

往期回顾

  1. 【分布式】浅谈CAP、BASE理论(1)

我将在下一期详细介绍反压形成的原因以及处理办法,敬请期待!!

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

如若内容造成侵权/违法违规/事实不符,请联系郑州代理记账网进行投诉反馈,一经查实,立即删除!

相关文章

从单目视觉信息学习深度信息(一)

现实生活中&#xff0c;除了人本身有两只眼睛可以通过双目视觉信息获取深度信息&#xff0c;我们很难方便的有如此稳定和精确的双目系统来测深度。最近接触到了AR.Drone的无人机&#xff0c;开放接口这种事情最喜欢了&#xff0c;似乎可以用深度信息来控制无人机的运动&#xf…

java引用拷贝,对象浅拷贝,对象深拷贝

JAVA对象拷贝分为两种方式&#xff0c;一种是引用拷贝&#xff0c;一种是对象拷贝 引用拷贝&#xff1a;和对象拷贝的不同之处在于&#xff0c;引用拷贝只会生成一个新的对象引用地址&#xff0c;但两个地址其最终指向的还是同一个对象&#xff1b; 对象拷贝&#xff1a;这种…

保研之路——哈深计算机预推免

哈深计算机预推免个人情况高校复试参与情况哈工深计算机学院直硕&#xff08;7.20&#xff09;结语嗯&#xff01;抱着不白花这么多路费住宿费的初衷准备写一个保研经验贴&#xff0c;希望学弟学妹少花点钱吧orz我的战术大概是只要学校给我发了邀请我就去&#xff08;除了时间冲…

$.extend中探索深拷贝和浅拷贝

网上这方面的教程比较多&#xff0c;由于上次看了篇错误的教程搞得我迷糊&#xff1b;特意写下这篇笔记&#xff0c;若文中有错误之处&#xff0c;忘路过的朋友及时指出&#xff0c;不想祸害其他朋友了&#xff1b; 首先说明下&#xff1a;深拷贝&#xff08;深复制&#xff0…

浅析deep深度选择器

之前在开发中遇到一个问题&#xff0c;vue项目结合element ui使用。 但是element ui的样式不一定符合我们的需求&#xff0c;这时我们就需要改变它的样式。 比如博主使用到了element ui的表格&#xff0c;但是表格有默认的背景色&#xff0c;鼠标滑过还有默认的高亮颜色。 我…

曾经,我以为我很懂MySQL索引

小伙伴想精准查找自己想看的MySQL文章&#xff1f;喏 → MySQL专栏目录 | 点击这里 腾讯云数据库负责人林晓斌说过&#xff1a;“我们面试MySQL同事时只考察两点&#xff0c;索引和锁”。言简意赅&#xff0c;MySQL索引的重要性不言而喻。MySQL索引历经了多个版本的迭代&#x…

es深度分页查询

前言 近期在做新的项目时&#xff0c;使用了ElasticSearch作为数据的存储和查询。接到了一个比较恶心的需求&#xff0c;需要对es进行分页查询&#xff0c;单次查询一万条&#xff0c;最多需要查询十次。当时也没想太多&#xff0c;需求评审时并没有及时反驳&#xff0c;既然掉…

配置babel-plugin-import报错的深坑

用的是antd design vue生成的项目&#xff0c;按着官网的提示一步一步下来&#xff0c;在配置babel-plugin-import时候发生了报错&#xff0c;一直找了很久没有解决问题&#xff0c; 问题&#xff1a; 项目可以正常运行&#xff0c;当配置babel-plugin-import时的问题 引入可…