簡體   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