我的Flink应用程序需要水印吗?如果不需要,我是否需要WatermarkStrategy.noWatermarks?

7

我不确定我的Flink应用程序是否需要水印。什么时候需要水印?

如果我不需要它们,WatermarkStrategy.noWatermarks()有什么用途?

1个回答

10
一个时间水印t标记了数据流中的一个位置,并声明该点处的流已经完全到达时间t
水印的唯一作用是触发基于事件时间的定时器的触发。
基于事件时间的定时器可以直接通过KeyedProcessFunction API使用,并且还被以下组件内部使用:
  • 事件时间窗口
  • CEP(模式匹配)库,如果您指定要进行基于事件时间的处理,则使用水印对输入流进行排序
  • Flink SQL,仅在进行基于事件时间的处理时使用:例如ORDER BY、版本化表连接、窗口、MATCH_RECOGNIZE等。
常见的不需要水印的情况包括仅依赖于处理时间的应用程序或批处理。或者处理具有时间戳但从未依赖于事件时间定时器的数据(例如简单的逐个事件处理)。
Flink的新源接口(由FLIP-27引入),确实需要WatermarkStrategy
env.fromSource(source, watermarkStrategy, sourceName);

在不需要水印的情况下,你可以在这个接口中使用WatermarkStrategy.noWatermarks()

David Anderson:如果我使用事件时间和滚动窗口,但在此情况下指定WatermarkStrategy.noWatermarks(),那么窗口是否会关闭并进行进度?或者如果我想避免使用水印,是否必须使用处理时间? - Asim Jalis
1
使用事件时间窗口的流式作业依赖于水印来关闭这些窗口,否则窗口将永远不会关闭。在批处理模式下,即使没有水印,窗口也会在作业结束时关闭。 - David Anderson

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接