首页 > 解决方案 > Flink:处理数据早于应用程序水印的键控流

问题描述

我将 Flink 与运动源和事件时间键控窗口一起使用。该应用程序将侦听实时数据流、窗口化(事件时间窗口)并处理每个键控流。我还有另一个用例,我还需要能够支持回填某些关键流的旧数据(这些将是事件时间<水印的新关键流)。

鉴于我正在使用水印,这会成为一个问题,因为 Flink 不支持每键水印。因此,任何用于回填的键控流最终都将被忽略,因为该流的事件时间将是 < 由实时流维护的应用程序水印。

我已经经历了其他类似的问题,但无法获得可能的方法。以下是我正在考虑的可能方法,但仍有一些悬而未决的问题。

可能的方法 - 1

(i) 保留一份专门用于回填目的的申请副本。回填工作很少发生(大约每月几次)。发送到应用程序副本的数据流将在流中具有开始和停止指示符。使用它我计划启动/重置水印。开放式问题?是否可以使用流中的指示器重置水印?我知道这不是最佳做法,但想不出替代解决方案。

跟进:清除 DataStream 中的 Flink 水印状态[未提供明确的解决方案。]

可能的方法 - 2 每个键都有并行实例,因为每个任务可能有不同的水印。-> 不这样做,因为我将拥有 > 5k 键控流。

让我知道是否需要任何其他细节。

标签: apache-flinkflink-streamingwatermark

解决方案


您可以通过在 BATCH 执行模式下运行回填作业来解决此问题。当 DataStream API 在批处理模式下运行时,输入是有界的(有限的),并且是预先知道的。这使得 Flink 可以通过键和时间戳对输入进行排序,并且处理将根据事件时间正确进行,而无需担心水印或延迟事件。


推荐阅读