Apache flink 从后期 window 访问键控状态

Apache flink accessing keyed state from late window

我正在编写一个 Flink 应用程序,它使用来自 kafka 的时间序列数据 话题。时间序列数据具有指标名称、标签键值等组件 对,时间戳和一个值。我创建了一个翻滚 window 来聚合 基于度量键的数据(它是度量名称、键的组合 值对和时间戳)。这是主流的样子

kafka source -> Flat Map which parses and emits Metric ->  Key by metric
key  -> Tumbling window of 60 seconds -> Aggregate the data -> write to the
sink.

我还想检查是否有任何指标在 以上 window。我想检查有多少指标迟到并计算 延迟指标与原始指标的百分比。我在想 使用 flink 的“allowedLateness”功能将延迟指标发送到 一个不同的流。我打算在主目录中添加一个“MapState” “聚合数据”运算符,它将键作为度量键,并且 值作为到达主 window.

的指标的计数
kafka source -> Flat Map which parses and emits Metric -> Key by metric key
->  Tumbling window of 60 seconds -> Aggregate the data (Maintain a map
state of metric count) -> write to the sink.

                                                   \

                                                    \

                                                  Late data -> Key by
 metric key ->  Collect late metrics and find the percentage of late metrics
 -> Write the result in sink

我的问题是“可以收集延迟指标并找到延迟百分比 metrics”操作员访问由更新的“MapState” 主流。即使它们由相同的公制密钥键入,我猜他们 是两个不同的任务。我想计算(延迟指标的数量/ (延迟指标的数量 + 准时到达的指标的数量)。

有几种不同的方法可以解决这个问题。

您可以将每个 window 状态存储在传递给您的 WindowProcessFunction 的上下文提供的 KeyedStateStore windowState() 中。与 allowedLateness 结合使用,您可以在延迟触发时计算延迟事件统计信息。 (这种方法不需要 MapState,因为 windowState 已经限定为特定的 window 和特定的键。ValueState 就足够了。)

另一个想法是从主 window 捕获延迟事件的侧输出流,并通过另一个 window 发送这些延迟事件,该 window 在某个时间范围内对它们进行计数。然后将延迟事件分析流和第一个(主要)window 的输出发送到 KeyedCoProcessFunction(或 RichCoFlatMap),该函数可以计算延迟事件与准时事件统计数据。 (这里您将需要 MapState,因为您可能需要为键控流的每个键同时打开多个 windows。)

或者您可以使用一个简单的处理函数将初始流分成两部分(通过将时间戳与当前水印进行比较)——一个用于迟到的事件,另一个用于未迟到的事件——然后使用 Flink SQL 计算所有统计数据。

或者只是在一个 KeyedProcessFunction 中实现整个事情。有关示例,请参阅 https://ci.apache.org/projects/flink/flink-docs-stable/docs/learn-flink/event_driven/