首页 > 其他分享 >【Flink】浅谈Flink背压问题(1)

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

时间:2023-01-28 17:03:45浏览次数:56  
标签:Task 1.0 浅谈 Flink 背压 反压 Queue TM

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

大家好,我们的gzh是朝阳三只大明白,满满全是干货,分享近期的学习知识以及个人总结(包括读研和IT),跪求一波关注,希望和大家一起努力、进步!!

概述

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

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

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

Flink数据通信模型

假如一个Flink任务(Job)中有 TaskA,TaskB,并发度都是 4,即 A1-A4,B1-B4。TaskA 与 TaskB 使用 keyby 连接。将这个 Flink Job 部署到 2 个 TM 中,每个 TM 分配 2 个 slots。那么Flink会将 【Flink】浅谈Flink背压问题(1)_Flink_02 放到一个 TM 中,【Flink】浅谈Flink背压问题(1)_Flink_03 放到一个 TM 中,具体示例如下图所示:

【Flink】浅谈Flink背压问题(1)_Flink原理_04

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

【Flink】浅谈Flink背压问题(1)_Flink原理_05

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

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

【Flink】浅谈Flink背压问题(1)_大数据_06

该方法有一定的缺陷:

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

Flink Network Metric

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

Task Status

OutputQueueUsage < 1.0

OutputQueueUsage == 1.0

InputQueueUsage < 1.0

正常

处于反压,其根本原因可能是该 Task 下游处理能力不足导致,持续下去,该 Task 将会向上游传递反压

InputQueueUsage == 1.0

处于反压,持续下去,该 Task 会向上游传递反压,而且该 Task 可能是反压的源头

处于反压,原因可能是被下游阻塞

现在看一个实际的例子

【Flink】浅谈Flink背压问题(1)_大数据_07

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

往期回顾

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

文中难免会出现一些描述不当之处(尽管我已反复检查多次),欢迎在留言区指正,相关的知识点也可进行分享,希望大家都能有所收获!!我将在下一期详细介绍反压形成的原因以及处理办法,敬请期待!!

标签:Task,1.0,浅谈,Flink,背压,反压,Queue,TM
From: https://blog.51cto.com/u_15945763/6024986

相关文章

  • 【Flink】详解Flink的八种分区
    【Flink】详解Flink的八种分区大家好,我们的gzh是朝阳三只大明白,满满全是干货,分享近期的学习知识以及个人总结(包括读研和IT),跪求一波关注,希望和大家一起努力、进步!!简介Flink是......
  • 【分布式】浅谈CAP、BASE理论(1)
    【分布式】浅谈CAP、BASE理论(1)大家好,我们的gzh是朝阳三只大明白,满满全是干货,分享近期的学习知识以及个人总结(包括读研和IT),跪求一波关注,希望和大家一起努力、进步!!CAP理论......
  • 浅谈PHP设计模式的访问者模式
    简介:访问者模式,属于行为型的设计模式。表示一个作用于某对象结构中的各元素的操作。它是你可以在不改变各元素的类的前提下定义作用于这些元素的新操作。适用场景:类中......
  • 浅谈树上启发式合并(Dsu on tree)
    树上启发式合并树上启发式合并(Dsuontree),是一个解决树上离线问题的有力算法,一般的复杂度是\(\mathcalO(n\logn)\)(假定转移可以\(\mathcalO(1)\)解决),时间复杂度相比......
  • 浅谈线性递推
    线性递推相关常系数齐次线性递推对于一般的递归式,我们有\(\sum\limits_{j=0}^{k}A_{i-j}R_j=0,i\gek\)定义\(S=AR\),则\(S\)的最高次为\(k-1\),小于\(R\)的最高次项\(......
  • 浅谈PHP设计模式的享元模式
    简介:享元模式,属于结构型的设计模式。运用共享技术有效地支持大量细粒度的对象。适用场景:具有相同抽象但是细节不同的场景中。优点:把公共的部分分离为抽象,细节依赖于抽......
  • 浅谈PHP设计模式的中介者模式
    简介:中介者模式,属于行为型的设计模式。用一个中介对象来封装一系列的对象交互。中介者是各对象不需要显式地相互引用,从而使其耦合松散,而且可以独立地改变他们之间的交互。......
  • 浅谈PHP设计模式的命令模式
    简介:命令模式:属于行为型的设计模式。将一个请求封装为一个对象,从而是你可用不同的请求对客户端进行参数化。对请求排队或记录请求日志,以及支持可撤销的操作。适用场景:命......
  • 浅谈SOFAJRaft中的ShutdownHook
    Java程序经常会遇到进程挂掉的情况,一些状态没有正确的保存下来,这时候就需要在JVM关掉的时候执行一些清理现场的代码。JAVA中的ShutdownHook提供了比较好的方案。而在SOFAJ......
  • 浅谈PHP设计模式的组合模式
    简介:组合模式,属于结构型的设计模式。将对象组合成树形结构以表示“部分-整体”的层次结构。组合模式使得用户对单个对象和组合对象的使用具有一致性。组合模式分两种状态......