Apache flink 如何处理flink流媒体中的未来事件?

Apache flink 如何处理flink流媒体中的未来事件?,apache-flink,flink-streaming,Apache Flink,Flink Streaming,我们正在计算一分钟滚动时间窗口内不同类型事件的最大并发计数 这些事件像传感器数据,这些数据是从我们的桌面代理每分钟收集的,然而,一些代理得到了一个错误的时间戳,比如说,它将是一个时间戳,甚至比现在晚了几个小时 所以,我的问题是如何处理/删除这些事件,目前我只是申请 筛选(s=>s.ct.getTimenow()) 调整时间戳(timestamp=min(timestamp,now()))或了解特定传感器关闭的原因(时区问题?) 使用更复杂的水印生成器 我认为前两种选择是直截了当的,我个人会选择

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

这些事件像传感器数据,这些数据是从我们的桌面代理每分钟收集的,然而,一些代理得到了一个错误的时间戳,比如说,它将是一个时间戳,甚至比现在晚了几个小时

所以,我的问题是如何处理/删除这些事件,目前我只是申请 筛选(s=>s.ct.getTime 我的第一个问题是,如果我不这样做,我怀疑这个糟糕的“未来”事件会触发窗口计算,即使是对于那些不完整的数据窗口

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

谢谢你这有趣的用例

首先是一些背景,然后是一些解决方案: flink中的窗口不会基于时间戳而触发,而是基于。这两者之间有着密切的联系,当涉及到窗口触发时,通常可以对它们进行相同的处理,但在这种情况下,明确区分很重要。因此,如果您使用严格绑定到时间戳的水印生成器,那么您的怀疑可能是有效的

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

  • 筛选无效事件(
    timestamp>now()
  • 调整时间戳(
    timestamp=min(timestamp,now())
    )或了解特定传感器关闭的原因(时区问题?)
  • 使用更复杂的水印生成器
我认为前两种选择是直截了当的,我个人会选择第二种。(固定数据总是好的)。让我们关注一下水印生成器

基本上你是没有限制的,你可以依靠你的想象力。以下是一些想法:

  • 仅当看到水印大于当前水印的X个事件时,才使用高级水印
  • 使用一些低通滤波器=慢速移动平均值
  • 忽略timestamp>now()的事件(因此仅过滤水印生成)
我很高兴听到您选择了哪种方式,我可以进一步帮助您。

有趣的用例

首先是一些背景,然后是一些解决方案: flink中的窗口不会基于时间戳而触发,而是基于。这两者之间有着密切的联系,当涉及到窗口触发时,通常可以对它们进行相同的处理,但在这种情况下,明确区分很重要。因此,如果您使用严格绑定到时间戳的水印生成器,那么您的怀疑可能是有效的

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

  • 筛选无效事件(
    timestamp>now()
  • 调整时间戳(
    timestamp=min(timestamp,now())
    )或了解特定传感器关闭的原因(时区问题?)
  • 使用更复杂的水印生成器
我认为前两种选择是直截了当的,我个人会选择第二种。(固定数据总是好的)。让我们关注一下水印生成器

基本上你是没有限制的,你可以依靠你的想象力。以下是一些想法:

  • 仅当看到水印大于当前水印的X个事件时,才使用高级水印
  • 使用一些低通滤波器=慢速移动平均值
  • 忽略timestamp>now()的事件(因此仅过滤水印生成)

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

谢谢您的快速回复。目前,我正在使用一个从BoundedAutoFordernessTimestampExtractor继承的简单子类,只需记录一条警告消息,然后将时间戳设置为Long.MinValue,即可删除这些事件。因此,基本上,#2方法(调整时间戳和忽略时间戳>现在())感谢您的快速回复。目前,我正在使用一个从BoundedAutoFordernessTimestampExtractor继承的简单子类,只需记录一条警告消息,然后将时间戳设置为Long.MinValue,即可删除这些事件。因此基本上,#2方法(调整timestamp并忽略timestamp>now())