我的 Flink 应用程序需要水印吗?如果没有,我需要 WatermarkStrategy.noWatermarks 吗?

Dav*_*son 7 apache-flink flink-streaming

我不确定我的 Flink 应用程序是否真的需要 Watermarks。什么时候需要它们?

如果我不需要它们,那么它们的目的是什么WatermarkStrategy.noWatermarks()

Dav*_*son 10

时间t的水印标记数据流中的位置,并断言该流在该点现在已在时间t之前完成。

水印的唯一目的是触发基于事件时间的计时器的触发。

基于事件时间的计时器由KeyedProcessFunctionAPI 直接公开,也由 API 内部使用

  • 事件时间窗口
  • CEP(模式匹配)库,如果您指定要进行基于事件时间的处理,它会使用 Watermarks 对传入流进行排序
  • Flink SQL,同样仅在进行基于事件时间的处理时:例如,ORDER BY、版本化表连接、窗口、MATCH_RECOGNIZE 等。

不需要水印的常见情况包括仅依赖处理时间或进行批处理的应用程序。或者当处理具有时间戳的数据时,但从不依赖事件时间计时器(例如,简单的逐个事件处理)。

FLIP-27 引入的 Flink 新源接口确实需要WatermarkStrategy

env.fromSource(source, watermarkStrategy, sourceName);
Run Code Online (Sandbox Code Playgroud)

如果您实际上不需要水印,则可以WatermarkStrategy.noWatermarks()在此界面中使用。