如何处理 Flink Streaming 中的未来事件?

How to handle future events in flink streaming?

我们正在计算 1 分钟滚动时间内不同类型事件的最大并发计数 window。

这些事件,例如从我们的桌面代理收集的传感器数据,以分钟为单位,但是,某些代理得到了错误的时间戳,比如说,它甚至会比现在晚几个小时。

所以,我的问题是如何handle/drop这些事件,目前我只是申请 filter(s => s.ct.getTime < now) 谓词排除它们。

我的第一个问题是,如果我不这样做,我怀疑这个糟糕的“未来”事件会触发 window 计算,即使是那些不完整的数据 window

第二个问题是,我们有没有更好的方法来防止这种情况?

谢谢

有趣的用例。

所以首先是一些背景,然后是一些解决方案: Windows 在 flink 中不基于时间戳触发,而是基于 watermarks。两者之间有着密切的联系,在 window 触发时通常可以一视同仁,但在这种情况下,明确区分很重要。所以是的,如果您使用严格绑定到时间戳的水印生成器,您的怀疑可能是有效的。

考虑到这一点,您有几个选择:

  • 过滤无效事件(timestamp > now()
  • 调整时间戳 (timestamp = min(timestamp, now())) 或了解特定传感器关闭的原因(时区问题?)
  • 使用更复杂的水印生成器

我认为前两个选项很简单,我个人会选择第 2 个选项。(修复数据总是好的)。让我们关注水印生成器。

你的方式基本上没有限制generate watermarks - 你可以依靠你的想象力。以下是一些想法:

  • 当您看到 X 个事件的水印大于当前水印时,仅推进水印。
  • 使用一些低通滤波器 = 慢速移动平均线。
  • 忽略时间戳 > now() 的事件(因此仅针对水印生成进行过滤)。
  • ...

我很高兴听到您选择了哪种方式,我可以帮助您更进一步。