问题描述
上下文:我正在处理的项目处理带有时间戳的文件,这些文件会定期(1分钟)生成,并将它们实时摄取到一系列级联的窗口运算符中。文件的时间戳指示事件时间,因此我不必依赖文件创建时间。每个窗口的处理结果都发送到接收器,接收器将数据存储在多个表中。
input -> 1 min -> 5 min -> 15 min -> ...
\-> sql \-> sql \-> sql
我正在尝试提出一种解决方案,以应对实时过程的可能停机时间。输入文件是独立生成的,因此,在Flink解决方案严重停机的情况下,我想像处理同一文件一样提取并处理丢失的文件。
我的第一个想法是配置相同流程的一种操作模式,该模式仅读取丢失的文件,并且允许延迟,该范围涵盖要处理的最早文件。但是,一旦处理完文件,就可以确保不会再提取任何较晚的文件,因此在整个过程中,我不一定需要保持最早的窗口处于打开状态,尤其是因为可能要处理的文件很多以这种方式处理。即使在设置了允许的延迟设置的情况下,是否也可以对关闭窗口进行某些处理,或者我应该考虑将整个操作读取为批处理操作,并按时间戳进行分区?
解决方法
由于您是使用事件时间处理按顺序提取输入文件的,所以我看不出为什么会有问题。当Flink作业恢复时,似乎应该可以从上次中断的地方恢复。
如果我误解了这种情况,并且您有时有时需要从过去的某个时候返回并处理(或重新处理)文件,那么执行此操作的一种方法是部署已配置的同一作业的另一个实例只摄取需要重新摄取的文件。无需将其重写为批处理作业-大多数流作业可以在有限的输入上运行。通过事件时间处理,此回填作业将产生与(近)实时运行相同的结果。