【问题标题】:Process past data in multiple window operators in Apache Flink?在 Apache Flink 中的多个窗口运算符中处理过去的数据?
【发布时间】:2020-09-07 09:16:51
【问题描述】:

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

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

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

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

【问题讨论】:

  • 两个问题:您是否使用事件时间处理,带有水印?您是否按顺序摄取输入文件?
  • 对两者都是:我正在使用事件时间,每次摄取文件时都会生成水印,并且在当前模式中可以假设文件是​​按顺序摄取的,因为它们是按顺序生成和检测的,但是如果我需要实现批量读取,我会按顺序摄取它们,是的。

标签: apache-flink real-time flink-streaming


【解决方案1】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多