Flink反压

2023/03/23

Tags: Flink

什么是反压

如果你看到一个 Task 发生 反压警告(例如: High),意味着它生产数据的速率比下游 Task 消费数据的速率要快。 在工作流中数据记录是从上游向下游流动的(例如:从 Source 到 Sink)。反压沿着相反的方向传播,沿着数据流向上游传播。

以一个简单的 Source -> Sink Job 为例。如果看到 Source 发生了警告,意味着 Sink 消费数据的速率比 Source 生产数据的速率要慢。 Sink 正在向上游的 Source 算子产生反压。

Task(SubTask)的每个并行实例都可以用三个一组的指标评价:

指标值说明:

反压问题定位

可以看各个operator的metrics的指标,比如:buffers.outPoolUsage、buffers.inPoolUsage、buffers.inputFloatingBuffersUsage、buffers.inputExclusiveBuffersUsage;

接收端共用一个LocalBufferPool,接收端每个Channel在初始化阶段都会分配固定数量的Buffer(Exclusive Buffer)。如果某一时刻接收端接受到的数量太多,Exclusive Buffer就会耗尽,此时就会向BufferPool申请剩余的Floating Buffer(除了Exclusive Buffer,其他的都是Floating Buffer,备用Buffer);inPoolUsage = floatingBuffersUsage + exclusiveBuffersUsage

  1. 若 inPoolUsage 低,而 outPoolUsage 低,则说明完全没有背压现象。
  2. 若 inPoolUsage 低,而 outPoolUsage 高,则说明处于临时状态,可能是背压刚开始,也可能是刚结束,需要再观察。
  3. 若 inPoolUsage 高,而 outPoolUsage 低,那么通常情况下这个算子就是背压的根源了。
  4. 若 inPoolUsage 高,而 outPoolUsage 高,则说明这个算子是被其他下游算子反压而来的,并不是元凶。

在反压定位过程中,建议关闭 Operator Chaining 优化,这样所有的算子可以单独拆分出来,不会相互干扰:

pipeline.operator-chaining: false

参考

监控反压 | Apache Flink