[英]How to add de-duplication to a streaming pipeline [apache-beam]
我在apache beam [python]中有一個正在工作的流傳輸管道,該管道從pub / sub提取數據,對數據流進行擴充,然后將其傳遞給big-query。
對於流式傳輸窗口,我想確保消息不會重復(因為pub / sub至少保證一次傳遞)。
因此,我認為我只會使用與Beam不同的方法,但是一旦使用它,我的管道就會中斷(無法繼續進行,任何本地打印內容也不可見)。
這是我的管道代碼:
with beam.Pipeline(options=options) as p:
message = (p | "ReadFromPubSub" >> beam.io.ReadFromPubSub(topic=known_args.topic).
with_output_types(bytes))
bq_data = (message | "Decode" >> beam.FlatMap(lambda x: [x.decode('utf-8')])
| "Deduplication" >> beam.Distinct()
| "JSONLoad" >> beam.ParDo(ReadAsJSON())
| "Windowing" >> beam.WindowInto(window.FixedWindows(10, 0))
| "KeepRelevantData" >> beam.ParDo(KeepRelevantData())
| "PreProcessing" >> beam.ParDo(PreProcessing())
| "SendLimitedKeys" >> beam.ParDo(SendLimitedKeys(), schema=schema)
)
if not known_args.local:
bq_data | "WriteToBigQuery" >> beam.io.WriteToBigQuery(table=known_args.bq_table, schema=schema)
else:
bq_data | "Display" >> beam.ParDo(Display())
如您在重復數據刪除標簽中看到的,我正在調用beam.Distinct方法。
問題:
重復數據刪除應在管道中的何處進行?
這甚至是正確/理智的方法嗎?
我還能如何刪除流緩沖區數據的重復數據?
是否需要重復數據刪除,還是我只是在浪費時間?
任何解決方案或建議將不勝感激。 謝謝。
您可能會發現有關一次處理的博客很有幫助。 首先,Dataflow已經基於發布/訂閱記錄ID執行重復數據刪除。 但是,如博客所述:“但是,在某些情況下,這還不夠。用戶的發布過程可能會重試發布”。
因此,如果將消息發布到Pub / Sub的系統可能多次發布同一條消息,則您可能希望添加自己的確定性記錄ID。 然后,Cloud Dataflow將檢測到這些。 這是我建議的方法,而不是嘗試在自己的管道中進行重復數據刪除。
您可以通過使用PubSubIO.Read上的withIdAttribute來實現。 例子
關於為什么我相信Distinct導致卡住的一些解釋。 Distinct嘗試對Window中的數據進行重復數據刪除。 我相信您正在嘗試對全局窗口進行重復數據刪除,因此您的管道必須緩沖並比較所有元素,並且由於這是無界的PCollection。 它將嘗試永遠緩沖。
我相信,如果您先執行窗口化,並且具有確定性的事件時間戳(看起來不像在使用withTimestampAttribute ),則此方法將正常工作。 然后,Distinct將僅應用於窗口內的元素(並且具有相同時間戳的相同元素將放置在同一窗口中)。 您可能想看看這是否適用於原型制作,但是我建議盡可能添加唯一的記錄ID,並允許Dataflow根據記錄ID處理重復以達到最佳性能。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.