Apache Beam/Dataflow 不会丢弃来自 Pub/Sub 的延迟数据



我很难理解Beam的窗口应该如何与丢弃延迟数据相关。

下面是我的管道:

pipeline
| ReadFromPubSub() 
| WindowInto(
FixedWindow(60), 
trigger=AfterWatermark(
early=AfterCount(1000),
late=AfterProcessingTime(60),
),
accumulation_mode=AccumulationMode.DISCARDING,
allowed_lateness=10*60,
)
| GroupByKey()
| SomeTransform()
| Map(print)

我的理解是,来自Pub/Sub的数据元素被分配了它们发布到订阅时的时间戳。

当我启动管道来消费来自Pub/Sub的数据时,其中也包括旧数据,我希望只有最近10分钟的数据(如allowed_lateness所设置的)输出WindowInto的参数。但是结果是所有订阅的数据都被打印出来了。

我错过了什么还是我理解窗口错误?

使用Python和Beam 2.42.0

在上述管道中,没有后期数据

数据只在与水印相比时延迟。为了计算水印,Beam使用正在读取的消息的时间戳。在您的示例中,是在ReadFromPubsub转换中生成消息时的时间戳。

除有效负载外,publsub消息还具有其他属性。Beam使用这些属性读取和设置每条消息的时间戳。如果没有指定任何时间戳,Beam将使用发布时间来设置该时间戳。因此,在您的情况下,您实际上是在处理时间(时间戳设置为当前处理时间)中工作,因此不可能有延迟的数据。水印将始终非常接近正在处理的消息的当前时间戳。

关于时间戳属性如何与Pubsub一起使用的更多细节,请参阅SO中的这个问题(对于Python,检查ReadFromPubsub中的参数timestamp_attribute)

如果您正在读取的消息中没有时间戳属性,但是它们包含一个带有时间戳的字段(在有效载荷中),您可以使用它来生成时间戳值(解析有效载荷,然后使用发出TimestampedValueWithTimestamps转换的DoFn)。

最新更新