我正在使用带有运动源和事件时间键控窗口的 Flink。该应用程序将监听实时数据流、窗口(事件时间窗口)并处理每个键控流。我有另一个用例,我还需要能够支持某些关键流的旧数据的回填(这些将是事件时间
鉴于我正在使用水印,这会成为一个问题,因为 Flink 不支持每键水印。因此,任何用于回填的键控流最终都将被忽略,因为该流的事件时间将小于实时流维护的应用程序水印。
我已经解决了其他类似的问题,但无法找到可能的方法。
以下是我正在考虑的可能方法,但仍有一些悬而未决的问题。
可能的方法 - 1
(i) 保留一份申请副本,专门用于回填目的。回填工作很少发生(大约每月几次)。发送到应用程序副本的数据流将在流中具有开始和停止的指示符。我计划使用它来启动/重置水印。
开放问题?是否可以使用流中的指示器重置水印?我知道这不是最佳实践,但无法想出替代解决方案。
跟进:清除DataStream中的Flink水印状态 https://stackoverflow.com/questions/53163364/clear-flink-watermark-state-in-datastream#new-answer[未提供明确的解决方案。]
可能的方法 - 2
每个键都有并行实例,因为每个任务可能有不同的水印。 -> 不这样做,因为我将拥有 > 5k 键控流。
如果需要任何其他详细信息,请告诉我。
您可以通过在 BATCH 执行模式下运行回填作业来解决此问题。当 DataStream API 在批处理模式下运行时,输入是有界(有限)的,并且是预先已知的。这允许 Flink 按键和时间戳对输入进行排序,并且处理将根据事件时间正确进行,而不用担心水印或延迟事件。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)