apache-beam 中的窗口是从哪个时间开始计算的?

问题描述 投票:0回答:2

我正在编写一个光束流管道,具有 1 分钟固定窗口。

我正在从 PubSub 读取数据,并使用 PubSub 消息的时间戳:

beam.WindowInto(window.FixedWindows(60)))

由于 PubSub 消息已经有时间戳信息,我不会明确提供时间戳信息。

现在,我的问题是:

  1. 假设我在“2019-03-27T09:50:00.000Z”开始我的光束管道,并在2019-03-27T09:50:20.000Z开始发布到PubSub主题,从那时起管道将开始数1分钟?窗口开始和结束时间是多少。

  2. 第二个问题,如果发布的消息出现故障怎么办?我的意思是,假设我在 *2019-03-27T09:50:10.000Z * 发布了一条消息,在 2019-03-27T09:50:40.000Z 发布了另一条消息,但是 2019-03-27T09:50:40.000Z首先到达并被光束消耗。那么,在这种情况下,窗口的开始时间是多少。

感谢您提前的帮助。

我已经创建了流管道,并且想知道有关窗口启动时间的信息。它认为哪个时间是窗口开始。

google-cloud-dataflow apache-beam apache-beam-io beam
2个回答
0
投票

默认情况下,beam.WindowInto(window.FixedWindows(60)) 将使用事件时间(Pub/Sub 消息时间戳)将元素分配给窗口。

使用

allowed_lateness
允许延迟数据。

请检查: https://beam.apache.org/documentation/programming-guide/#watermarks-and-late-data


0
投票

考虑窗口化的方式是将整个时间线划分为一组窗口,例如

...
[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 的所有元素都已交付(如果错误,这将被视为“迟到的数据”,并且一个也可以影响基于触发器的元素的发射,但大多数管道不需要关心这些困难。)

© www.soinside.com 2019 - 2024. All rights reserved.