Apache flink Flink中的会话窗口出现意外结果

Apache flink Flink中的会话窗口出现意外结果,apache-flink,flink-streaming,Apache Flink,Flink Streaming,我有一个由两个字段“键入”的记录流,然后分配一个间隔为30秒的会话窗口。我使用附加在记录上的“时间戳”作为事件时间。我正在使用“AssigningAscendingTimeStamps”水印 以下面的记录为例。流由(用户、位置)设置关键帧 记录1:user1,place1,时间戳t1 记录2:user2,place1,时间戳t1后30秒 记录3:user1,place1,时间戳在t1的30秒内 记录4:user1,place1,时间戳t1后30秒 Record2属于user2,因此在对流进行键控

我有一个由两个字段“键入”的记录流,然后分配一个间隔为30秒的会话窗口。我使用附加在记录上的“时间戳”作为事件时间。我正在使用“AssigningAscendingTimeStamps”水印

以下面的记录为例。流由(用户、位置)设置关键帧

记录1:user1,place1,时间戳t1

记录2:user2,place1,时间戳t1后30秒

记录3:user1,place1,时间戳在t1的30秒内

记录4:user1,place1,时间戳t1后30秒

Record2属于user2,因此在对流进行键控时,它属于不同的bucket。因此,我希望Record1、Record3和Record4属于一个bucket,Record2属于另一个bucket

Bucket1

记录1:user1,place1,时间戳t1

记录3:user1,place1,时间戳在t1的30秒内

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

Bucket2

记录2:user2,place1,时间戳t1后30秒


据我所知,只有在Record4到达时才会触发包含Record1和Record3的会话窗口。但是当我运行代码时,当Record2到达时,只包含Record1的会话被触发,因为Record2的时间戳在Record1的时间戳的时间间隔(30秒)之后,尽管Record2的键不同。我浏览了弗林克的文档和几个可以在线找到的会话窗口示例。但我无法解决这个问题。这里有我遗漏的东西吗?这可能是因为升序时间戳水印吗?

问题是
分配升序时间戳
要求所有键的时间戳都是单调递增的。原因是Flink无法生成每密钥水印

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

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

更新
由于Flink无法生成每键水印,因此必须生成水印,使其对所有元素都有效。如果每个键的时间戳是单调的,但不是所有键都是单调的,那么必须定义两个键之间的最大无序度(时间戳的差异)。通过从元素的时间戳中减去这个无序性,您将获得一个有效的水印。另见。但是,请注意,如果元素到达时出现较大的无序情况,则这也将中断。

感谢您的回复。我需要处理来自用户设备的记录。附加到记录的时间戳取决于设备时钟。我的处理需要对每个用户单独进行,并且我只能使用设备时间戳作为我的事件时间,因为不同用户的时间戳将不同步。如果Flink不能生成每个密钥的水印,我的处理方法将全部出错。在这种情况下,您会建议什么方法?感谢您的回复。我需要处理来自用户设备的记录。附加到记录的时间戳取决于设备时钟。我的处理需要对每个用户单独进行,并且我只能使用设备时间戳作为我的事件时间,因为不同用户的时间戳将不同步。如果Flink不能生成每个密钥的水印,我的处理方法将全部出错。在这种情况下,您建议采用什么方法?