Flink 中的会话窗口给出意外结果



我有一个记录流,这些记录由两个字段"键入",然后分配了一个间隔为 30 秒的会话窗口。我使用附加到记录的"时间戳"作为事件时间。我正在使用"分配升序时间戳"水印。

以以下记录为例。流由(用户,位置)键控。

记录 1:用户 1、位置 1、时间戳 t1

记录 2:用户 2,位置 1,时间戳 t1 后 30 秒

记录 3:用户 1、地点 1、t1 30 秒内的时间戳

记录 4:用户 1,位置 1,时间戳 t1 后 30 秒

Record2 属于用户 2,因此它属于不同的存储桶,因为流是键控的。因此,我期望记录 1、记录 3 和记录 4 属于一个存储桶,而记录 2 属于另一个存储桶。

存储桶1

记录 1:用户 1、位置 1、时间戳 t1

记录 3:用户 1、地点 1、t1 30 秒内的时间戳

记录 4 - 用户 1,位置 1,时间戳 t1 后 30 秒

桶2

记录 2:用户 2,位置 1,时间戳 t1 后 30 秒

根据我的理解,包含记录 1 和记录 3 的会话窗口只有在记录 4 到达时才会触发。但是当我运行代码时,仅包含 Record1 的会话会在 Record2 到达时触发,因为 Record2 的时间戳在 Record1 时间戳的时间间隔(30 秒)之后,尽管 Record2 的键不同。我浏览了 Flink 的文档和几个我可以在网上找到的 Session Windows 示例。然而,我无法解决这个问题。我在这里缺少什么吗?这可能是因为时间戳水印升序吗?

问题是assignAscendingTimestamps要求时间戳在所有键中单调递增。原因是 Flink 无法生成每个密钥的水印。

更新

由于 Flink 无法生成每个键水印,因此必须生成水印,以便它们对所有元素都有效。如果每个键的时间戳是单调的,但不是跨所有键的时间戳,则必须定义两个键之间的最大无序性(时间戳差异)。通过从元素的时间戳中减去这个无序,您将获得有效的水印。另请参阅BoundedOutOfOrdernessTimestampExtractor。但是,请注意,如果元素到达时顺序较大,则这也将中断。

相关内容

  • 没有找到相关文章