我不确定我的Flink应用程序是否真的需要水印。什么时候需要它们?
如果我不需要它们,WatermarkStrategy.noWatermarks()
的目的是什么?
时间t的水印标记数据流中的一个位置,并断言在该点上,数据流现在已经完成了t。
水印的唯一用途是触发触发基于事件时间的定时器。
基于事件时间的计时器由KeyedProcessFunction
API直接公开,也由内部使用
- 事件时间窗口
- CEP(模式匹配(库,如果指定要进行基于事件时间的处理,则使用Watermarks对传入流进行排序
- Flink SQL,同样仅在执行基于事件时间的处理时:例如,ORDER BY、版本表联接、窗口、MATCH _RECOGNIZE等
不需要水印的常见情况包括仅依赖处理时间或在进行批处理时使用的应用程序。或者在处理具有时间戳但从不依赖事件时间计时器的数据时(例如,简单的逐个事件处理(。
FLIP-27引入的Flink的新源接口确实需要WatermarkStrategy
:
env.fromSource(source, watermarkStrategy, sourceName);
在实际不需要水印的情况下,可以在此界面中使用WatermarkStrategy.noWatermarks()
。