Flink 的 Watermark 是用来标识数据流中的一个时间点。Watermark 的设计是为了解决乱序数据处理的问题,尤其是涉及到多个分区的 Kafka 消费者时。在 Watermark 的作用下,即使某些数据出现了延迟到达的情况,也不会导致整个处理流程的中断。此外,Watermark 还能防止过期的数据被处理,从而提高了数据处理的准确性。
具体来说,Watermark 有以下两个主要的功能:
-
解决乱序问题:通过设置 Watermark,可以确保处理过程不会因为等待数据而无限期地阻塞。这样,即使在数据出现延迟的情况下,也能及时处理后续的数据,而不是等到所有的数据都到达之后再开始处理。
-
允许一定程度的延迟:Watermark 可以在一定程度上接受数据的延迟到达,但同时会有一个设定的最大延迟时间。当数据流中的事件时间戳大于等于水印加上这个最大延迟时间时,就会触发相应的计算操作。这样可以避免因长时间的延迟而导致的不必要的计算开销。
目录
Watermark 策略简介
为了使用事件时间语义,Flink 应用程序需要知道事件时间戳对应的字段,通常通过使用 TimestampAssigner API 从元素中的某个字段去访问/提取时间戳。时间戳的分配与 Watermark 的生成是齐头并进的,其可以告诉 Flink 应用程序事件时间的进度。可以通过指定 WatermarkGenerator 来配置 Watermark 的生成方式。
使用 Flink API 时需要设置一个同时包含 TimestampAssigner 和 WatermarkGenerator 的 WatermarkStrategy。WatermarkStrategy 工具类中提供了许多常用的 Watermark 策略,并且用户也可以在某些必要场景下构建自己的 Watermark 策略。例如,你想要要使用有界无序(bounded-out-of-orderness)watermark 生成器和一个 lambda 表达式作为时间戳分配器,那么可以按照如下方式实现:
WatermarkStrategy
.<Tuple2<Long, String>>forBoundedOutOfOrderness(Duration.ofSeconds(20))
.withTimestampAssigner((event, timestamp) -> event.f0);
其中 TimestampAssigner
Flink Watermark 机制详解
订阅专栏 解锁全文
2195

被折叠的 条评论
为什么被折叠?



