从 watermarks 角度看 Flink 开发者的角色

Flink developer's role from watermarks perspective

我是 Flink 新手,看到一篇文章提到

"flink 开发人员负责通过在流中安排水印来向前移动事件时间"。

所以,我找到了可能的答案。据我所知,如果我指示程序每 5 秒发出水印。实际上,每隔 5 秒,Flink 就会调用 AssignerWithPeriodicWatermarksgetCurrentWatermark() 方法。如果方法 returns 一个时间戳大于前一个水印的时间戳的非空值,则转发新的水印。此检查对于确保事件时间不断增加是必要的;否则不生成水印。

因此,一旦 window 中的所有内容都到达,它将触发运算符并进行相应的计算,那么 processfunctions 的作用是什么?水印只有processfunctions可以用吧?

您所说的周期性水印是正确的。但通常我会建议将自动水印间隔保留为默认值 200 毫秒;将其设置为 5 秒会给您的管道增加 5 秒的延迟。

在 Flink 的 APIs 的最低级别,水印用于触发事件时间计时器,这些计时器仅在流程功能中公开。流程功能是实现事件驱动应用程序的基本构建块。您正在挂钩到主事件循环,在每个事件可用时对其进行处理。您还可以访问容错、低延迟、可扩展的状态存储和计时器。

在 DataStream 的更高级别 API,水印用于触发事件时间 windows,并由 CEP(在进行模式匹配之前对流进行排序)。 Table/SQL API by windows、interval joins、temporal joins 和 MATCH_RECOGNIZE 也使用了水印。在所有这些情况下,这些时间运算符使用水印来观察事件时间的进展,以便它们可以在这些结果准备就绪时发出结果,然后释放不再有用的状态。