在 Apache Flink 的多个 window 运算符中处理过去的数据?

Process past data in multiple window operators in Apache Flink?

上下文:我正在处理的项目处理定期(1 分钟)生成的带时间戳的文件,并将它们实时摄取到一系列级联 window 运算符中。文件的时间戳表示事件时间,所以我不需要依赖文件创建时间。每个 window 的处理结果被发送到一个接收器,该接收器将数据存储在几个表中。

input -> 1 min -> 5 min -> 15 min -> ...
          \-> SQL  \-> SQL  \-> SQL

我正在尝试提出一个解决方案来处理实时进程可能出现的停机时间。输入文件是独立生成的,所以在 Flink 解决方案严重宕机的情况下,我想像被同一个进程摄取一样摄取和处理丢失的文件。

我的第一个想法是配置一种相同流程的操作模式,它只读取丢失的文件,并允许延迟,涵盖最早要处理的文件。但是,一旦处理了一个文件,就可以保证不会再摄取迟到的文件,所以我不一定需要在整个过程中保持最早的 window 打开,特别是因为可能有以这种方式处理的文件很多。是否可以对关闭 windows 做一些事情,即使设置了允许的迟到,或者我应该考虑将整个事情作为批处理操作读取并改为按时间戳分区?

由于您是按顺序提取输入文件,使用事件时间处理,我不明白为什么会出现问题。当 Flink 作业恢复时,它似乎应该能够从中断的地方恢复。

如果我误解了这种情况,并且您有时需要返回并处理(或重新处理)过去某个时间点的文件,一种方法是部署同一作业的另一个实例,配置为仅摄取需要(重新)摄取的文件。不需要将其重写为批处理作业——大多数流式处理作业可以 运行 有界输入。通过事件时间处理,此回填作业将产生与 运行 in(接近)real-time.

相同的结果