[英]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
)
如果您正在閱讀的消息中沒有時間戳屬性,但它們包含一個帶有時間戳的字段(在負載中),您可以使用它來生成時間戳值(解析負載然后使用發出TimestampedValue
的DoFn
,或者WithTimestamps
轉換)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.