Streaming 预定义的时间戳提取器/水印发射器
如时间戳和水印处理所述,Flink 提供了抽象概念来允许程序指定自己的timestamp
和watermark
发射器。更具体地说,用户可以根据自己的需要来实现AssignerWithPeriodicWatermarks
和AssignerWithPunctuatedWatermarks
中的接口来指定自己的timestamp
和发射自己的watermark
。
为了更进一步的简化这些任务的编程工作,Flink还提供了一些预实现的timestamp
分配器,这个章节提供了这些预实现timestamp
分配器的列表。除了它们拆箱即用的功能外,它们的实现也可作为自定义实现的例子。
递增时间戳分配器(Assigners with ascending timestamps)
对于周期性水印生成,最简单的特殊情况是时间戳被给定源任务按递增顺序产生。在这种情况下,当前时间戳始终可以作为水印,因为没有更早的时间戳。
注意,每个并行数据源任务的timestamp
是递增的。例如:如果指定了一个Kafka分区被一个并行数据源实例读取,那么每个Kafka分区的timestamp是递增的。Flink的watermark合并机制将会在并行数据流shuffled、unioned、connected 或者 merged的时候产生正确的水印。
val stream: DataStream[MyEvent] = ...
val withTimestampsAndWatermarks = stream.assignAscendingTimestamps( _.getCreationTime )
允许固定数量延迟的分配器(Assigners allowing a fixed amount of lateness)
周期性水印生成的另一个例子是当水印滞后的最大时间戳在数据流中被认为是一个固定的时间。在这种情况下数据流中遇到的最大延迟是已知的,例如,创建一个带时间戳的并在一个固定的时间内传播的元素的测试源。对于这些情况,Flink 提供了BoundedOutOfOrdernessTimestampExtractor
以maxOutOfOrderness
作为参数,这个maxOutOfOrderness
是指在窗口计算的最后,一个元素允许的最大延迟时间。延迟与t-t_w
的结果相对应,这里t
指的是元素的timestamp,而t_w
指的是上个水印。如果延迟>0 那么这个元素被认为是延迟的,默认情况下,这个元素不计入窗口的最终计算中。请参考允许时延Allowed Lateness来获取更多关于延迟元素如何工作的信息。
val stream: DataStream[MyEvent] = ...
val withTimestampsAndWatermarks = stream.assignTimestampsAndWatermarks(
new BoundedOutOfOrdernessTimestampExtractor[MyEvent](Time.seconds(10))( _.getCreationTime ))