在处理后,在Flink中将元素传递回输入流?

问题描述 投票:1回答:1

场景:

我有来自传感器的事件流。事件可以是T-typeJ-Type

  • T型事件具有事件发生时间戳。
  • J型事件具有开始和结束时间戳。

基于J-Type事件的开始和结束时间戳记,将聚合逻辑应用于该时间范围内的所有T-type事件,并将结果写入数据库。

为此,我创建了一个自定义触发器,该触发器将在收到J-Type事件时触发。在我的自定义ProcessWindowFunction中,我正在执行聚合逻辑和时间检查。

但是,在某些情况下,T型事件不会落在当前J型事件的时间范围内。在这种情况下,应在清除当前窗口之前将T型事件推送到下一个窗口。

Stream Window

解决方案的思想:

  1. 在自定义窗口处理功能中,将未处理的T型事件推入Kinesis流(源)。 (最坏情况的解决方案)

  2. 代替FIRE_AND_PURGE,使用FIRE来维护整个运行时的状态。使用元素迭代器删除已处理的元素。 (不建议使用,以保持无限的窗口)

想知道,是否有任何方法可以将未处理的事件直接推回输入流(无运动学)。 (重新排队)

[可以通过任何方式维护keyBy Context中的状态,以便我们与窗口元素一起(在此之前或之前)对这些未处理的数据执行计算。

java apache-flink flink-streaming amazon-kinesis amazon-kinesis-analytics
1个回答
0
投票

这里有两个解决方案。它们的基本行为大致相同,但是您可能会发现其中一个更容易理解,维护或测试。

关于您的问题,不,没有办法将未消耗的事件循环回(重新排队)而不将它们推回Kinesis。但是,只要坚持使用它们直到需要它们就可以了。

解决方案1:使用RichFlatMapFunction

当T型事件到达时,将它们附加到ListState对象。当J类型事件到达时,从列表中收集所有匹配的T类型事件,并更新列表以仅保留那些将属于以后的J类型事件的T类型事件。

解决方案2:将GlobalWindows与自定义触发器和逐出器一起使用

除了已经完成的操作之外,实现一个Evictor,该C0(在对窗口执行FIREd之后)仅从窗口中删除J型事件和所有匹配的T型事件。

© www.soinside.com 2019 - 2024. All rights reserved.