这是一个非常经典的流处理(尤其是 Apache Flink)中的数据倾斜/分区空闲导致 Watermark 停滞的问题。 为什么会发生这个问题?(根本原因) 在 Flink 中,基于事件时间(Event Time)的窗口触发依赖于 Watermark(水位线)。 当 Flink 从 Kafka 读取多分区数据时,Watermark 是按分区(Per-Partition)生成的。为了保证数据的一致性,Flink 会采用“木桶原理”:全局的 Watermark 取所有分区 Watermark 的最小值(Min)。 如果其中一个 Partition 因为没有新数据,它的 Watermark 迟迟不更新,就会导致全局 Watermark 停滞,进而导致下游所有的窗口都无法被触发。 --- 解决方案 解决这个问题通常有以下几种方案,按推荐程度从高到低排列: 方案一:使用 Flink 内置的 (最推荐、最优雅) Flink 官方早就考虑到了这个问题,并在 中提供了一个 方法。 原理: 当某个 Partition 在指定的时间内(例如 10 秒)没有收到任何数据,Flink 会将该 Parti...