簡體   English   中英

如何在流傳輸管道中添加重復數據刪除[apache-beam]

[英]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方法。

問題:

  1. 重復數據刪除應在管道中的何處進行?

  2. 這甚至是正確/理智的方法嗎?

  3. 我還能如何刪除流緩沖區數據的重復數據?

  4. 是否需要重復數據刪除,還是我只是在浪費時間?

任何解決方案或建議將不勝感激。 謝謝。

您可能會發現有關一次處理的博客很有幫助。 首先,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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM