在Flink中支持三种不同的时间概念:处理时间(processing time)、事件时间(event time)、摄取时间(Ingestion time)。
而水印是衡量event time 进展的一种机制,它通常基于事件时间数据属性产生,水印作为数据流的一部分流动并带有时间戳t,代表该时间点以前的数据都已经到达。
watermark主要是用于处理乱序事件。而正确的处理乱序事件,通常用watermark机制结合window来实现。
流处理从事件产生,到流经source,再到operator,中间是有一个过程和时间的。虽然大部分情况下,流到operator的数据都是按照事件产生的时间顺序来的,但是也不排除由于网络、背压等原因,导致乱序的产生(out-of-order或者说late element)。
但是对于late element,我们又不能无限期的等下去,必须要有个机制来保证一个特定的时间后,必须触发window去进行计算了。这个特别的机制,就是watermark。
为了处理事件时间,Flink需要知道事件的时间戳,这意味着流中的每个元素都需要分配其事件时间戳。这通常通过从元素中的某个字段访问/提取时间戳来完成。
时间戳分配与生成水印密切相关,水印告诉系统事件时间的进展。
有两种方法可以分配时间戳并生成水印:
- 直接在数据流源中
- 通过时间戳分配器/水印生成器:在Flink中,时间戳分配器还定义要发出的水印
流源可以直接为它们生成的元素分配时间戳,它们也可以发出水印。完成此操作后,不需要时间戳分配器。请注意,如果使用时间戳分