我有一个记录流,这些记录由两个字段"键入",然后分配了一个间隔为 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。但是,请注意,如果元素到达时顺序较大,则这也将中断。