我正在编写一个光束流管道,具有 1 分钟固定窗口。
我正在从 PubSub 读取数据,并使用 PubSub 消息的时间戳:
beam.WindowInto(window.FixedWindows(60)))
由于 PubSub 消息已经有时间戳信息,我不会明确提供时间戳信息。
现在,我的问题是:
假设我在“2019-03-27T09:50:00.000Z”开始我的光束管道,并在2019-03-27T09:50:20.000Z开始发布到PubSub主题,从那时起管道将开始数1分钟?窗口开始和结束时间是多少。
第二个问题,如果发布的消息出现故障怎么办?我的意思是,假设我在 *2019-03-27T09:50:10.000Z * 发布了一条消息,在 2019-03-27T09:50:40.000Z 发布了另一条消息,但是 2019-03-27T09:50:40.000Z首先到达并被光束消耗。那么,在这种情况下,窗口的开始时间是多少。
感谢您提前的帮助。
我已经创建了流管道,并且想知道有关窗口启动时间的信息。它认为哪个时间是窗口开始。
默认情况下,beam.WindowInto(window.FixedWindows(60)) 将使用事件时间(Pub/Sub 消息时间戳)将元素分配给窗口。
使用
allowed_lateness
允许延迟数据。
请检查: https://beam.apache.org/documentation/programming-guide/#watermarks-and-late-data
考虑窗口化的方式是将整个时间线划分为一组窗口,例如
...
[2019-03-27T09:50:00.000Z, 2019-03-27T09:51:00.000Z)
[2019-03-27T09:51:00.000Z, 2019-03-27T09:52:00.000Z)
[2019-03-27T09:52:00.000Z, 2019-03-27T09:53:00.000Z)
[2019-03-27T09:53:00.000Z, 2019-03-27T09:54:00.000Z)
...
然后,当元素进入时,它会根据时间戳将每个元素分配给其中一个窗口(无论管道何时启动)。默认情况下,它们与 epoc 的开头对齐,但如果不需要,FixedWindows 会采用 offset 参数,例如`FixedWindows(60, offset=15) 会将时间线切割成窗口
...
[2019-03-27T09:50:15.000Z, 2019-03-27T09:51:15.000Z)
[2019-03-27T09:51:15.000Z, 2019-03-27T09:52:15.000Z)
[2019-03-27T09:52:15.000Z, 2019-03-27T09:53:15.000Z)
[2019-03-27T09:53:15.000Z, 2019-03-27T09:54:15.000Z)
...
哪个元素“先”也并不重要。窗口的每个元素都会在任何分组/聚合操作中保留,直到所有元素到达为止。 (这里有一些微妙之处,因为我们依赖源(例如 PubSub)来告诉我们在哪一点,直到时间戳 X 的所有元素都已交付(如果错误,这将被视为“迟到的数据”,并且一个也可以影响基于触发器的元素的发射,但大多数管道不需要关心这些困难。)