首页 > 解决方案 > 在 Apache Flink 中的多个窗口运算符中处理过去的数据?

问题描述

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

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

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

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

标签: apache-flinkreal-timeflink-streaming

解决方案


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

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


推荐阅读