apache-flink - Flink:处理数据早于应用程序水印的键控流
问题描述
我将 Flink 与运动源和事件时间键控窗口一起使用。该应用程序将侦听实时数据流、窗口化(事件时间窗口)并处理每个键控流。我还有另一个用例,我还需要能够支持回填某些关键流的旧数据(这些将是事件时间<水印的新关键流)。
鉴于我正在使用水印,这会成为一个问题,因为 Flink 不支持每键水印。因此,任何用于回填的键控流最终都将被忽略,因为该流的事件时间将是 < 由实时流维护的应用程序水印。
我已经经历了其他类似的问题,但无法获得可能的方法。以下是我正在考虑的可能方法,但仍有一些悬而未决的问题。
可能的方法 - 1
(i) 保留一份专门用于回填目的的申请副本。回填工作很少发生(大约每月几次)。发送到应用程序副本的数据流将在流中具有开始和停止指示符。使用它我计划启动/重置水印。开放式问题?是否可以使用流中的指示器重置水印?我知道这不是最佳做法,但想不出替代解决方案。
跟进:清除 DataStream 中的 Flink 水印状态[未提供明确的解决方案。]
可能的方法 - 2 每个键都有并行实例,因为每个任务可能有不同的水印。-> 不这样做,因为我将拥有 > 5k 键控流。
让我知道是否需要任何其他细节。
解决方案
您可以通过在 BATCH 执行模式下运行回填作业来解决此问题。当 DataStream API 在批处理模式下运行时,输入是有界的(有限的),并且是预先知道的。这使得 Flink 可以通过键和时间戳对输入进行排序,并且处理将根据事件时间正确进行,而无需担心水印或延迟事件。
推荐阅读
- javascript - Javascript按值访问对象数组
- flutter - 在应用程序加载时多次调用 Flutter HTTP 请求
- r - 使用循环在 R 中创建多个混淆矩阵
- python - 将产生 BMI 和用户所属类别的函数
- android - 为什么 Android 无法识别“BillingClient”
- c++-cli - c++/cli 中的托管指针是否使用 GCRoot 自动初始化为 nullptr?
- ios - CoreML:异常 Espresso 异常:“无效状态”:空输出 blob
- reactjs - 解析器中的值未定义(Graphql、Apollo、React)
- java - 使用 EntityUtils.consume(httpEntity) 直到流结束消费如何导致将连接释放回连接池?
- python - 在数据框列的一系列 NaN 之后删除第一个值