flink back pressure | 张洪铭的个人博客
张洪铭的个人博客

flink back pressure

flink 背压:

Flink 在运行时主要由 operators 和 streams 两大组件构成。每个 operator 会消费中间态的流,并在流上进行转换,然后生成新的流。对于 Flink 的网络机制一种形象的类比是,Flink 使用了高效有界的分布式阻塞队列,就像 Java 通用的阻塞队列(BlockingQueue)一样

一个较慢的接受者会降低发送者的发送速率,因为一旦队列满了(有界队列)发送者会被阻塞。Flink 解决反压的方案就是这种感觉。

在 Flink 中,这些分布式阻塞队列就是这些逻辑流,而队列容量是通过缓冲池来(LocalBufferPool)实现的。每个被生产和被消费的流都会被分配一个缓冲池。缓冲池管理着一组缓冲(Buffer),缓冲在被消费后可以被回收循环利用。这很好理解:你从池子中拿走一个缓冲,填上数据,在数据消费完之后,又把缓冲还给池子,之后你可以再次使用它。

背压监测通过反复采集运行任务的堆栈跟踪样本来工作。JobManager为作业的任务触发对Thread.getStackTrace()的重复调用。
默认情况下,作业管理器为每个任务每50毫秒触发100个堆栈跟踪(也就是说一次反压检测至少要等待5秒钟),以确定背压。你在Web界面中看到的比率告诉你,这些堆栈跟踪中有多少被困在内部方法调用中,例如0.01表示只有100的1被困在该方法中。

此处输入图片的描述

配置:
web.backpressure.refresh-interval: 不推荐使用可用统计信息并需要刷新的时间 (默认: 60000, 1 分钟).
web.backpressure.num-samples: 测定背压所需的堆栈跟踪样本数 (默认: 100).
web.backpressure.delay-between-samples: 测定背压的堆栈跟踪样本之间的延迟 (默认: 50, 50 ms).

参考官方文档:https://ci.apache.org/projects/flink/flink-docs-release-1.9/monitoring/back_pressure.html

坚持原创技术分享,您的支持将鼓励我继续创作!