繁体   English   中英

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

[英]Apache Beam/Dataflow doesn't discard late data from 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 分钟的数据(在 WindowInto 的allowed_lateness参数中设置)。 但结果是订阅的所有数据都被打印出来了。

我是不是遗漏了什么,或者我对 Windowing 的理解有误?

我使用 Python 和 Beam 2.42.0

在上面的管道中,没有迟到的数据。

数据仅在与水印相比时才晚。 为了计算水印,Beam 使用正在读取的消息的时间戳。 在您的情况下,消息在ReadFromPubsub转换中生成时的时间戳。

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

有关时间戳属性如何与 Pubsub 一起使用的更多详细信息,请参阅 SO 中的此问题(对于 Python,请检查ReadFromPubsub中的参数timestamp_attribute

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM