Flink中的Session Windows给出了意想不到的结果

时间:2017-05-18 16:40:39

标签: apache-flink flink-streaming

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

例如,考虑以下记录。流由(用户,地点)键入。

Record1:user1,place1,timestamp t1

Record2:user1,place1,t1后30秒的时间戳

Record3:user1,place1,时间戳在t1的30秒内

Record4:用户1,place1,t1后30秒的时间戳

Record2属于user2,因此它在键入流时属于不同的存储桶。因此我期待Record1,Record3和Record4属于一个存储桶而Record2属于另一个存储桶。

Bucket1

Record1:user1,place1,timestamp t1

Record3:user1,place1,时间戳在t1的30秒内

Record4 - user1,place1,t1后30秒的时间戳

Bucket2

Record2:user1,place1,t1后30秒的时间戳

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

1 个答案:

答案 0 :(得分:4)

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

更新

由于Flink无法生成每个密钥水印,因此必须生成水印,使其对所有元素都有效。如果时间戳是每个键单调而不是所有键,则必须定义两个键之间的最大不按顺序(时间戳的差异)。通过从元素的时间戳中减去此不按顺序,您将获得有效的水印。另见BoundedOutOfOrdernessTimestampExtractor。但是,请注意,如果元素以较大的无序性到达,那么这也会破坏。