2017-10-09 16 views
0

我正面臨着一個奇怪的問題,那就是我在帶有Apache Beam的流BigQuery表上實現了一個小的delta作業。BigQuery上的Delta作業未命中記錄

我正在將數據流式傳輸到BigQuery表,並且每運行一小時我都會將任何新記錄從該流式表複製到協調錶中。增量構建在我在流表上引入的CreateDatetime列的頂部。一旦記錄被加載到流表中,它將獲得當前的UTC時間戳。因此,三角洲自然會取得所有具有比上一次更新的CreateDatetime的記錄,直到當前批處理運行的時間。

CreatedDatetime >= LastDeltaDate AND 
CreatedDatetime < NowUTC 

爲LastDeltaDate的邏輯如下:

1. Start: LastDeltaDate = 2017-01-01 00:00:00 
2. 1st Delta Run: 
- NowUTC = 2017-10-01 06:00:00 
- LastDeltaDate = 2017-01-01 00:00:00 
- at the end of the successful run LastDeltaDate = NowUTC 
3. 2nd Delta Run: 
- NowUTC = 2017-10-01 07:00:00 
- LastDeltaDate = 2017-10-01 06:00:00 
- at the end of the successful run LastDeltaDate = NowUTC 
... 

現在每一天,我發現是我流表,但一直沒有收到我的核對錶中的記錄。當我檢查時間戳時,我發現它們遠離批處理運行,當我檢查Google Datflow日誌時,我可以看到當時沒有返回查詢的記錄,但是當我現在運行相同的查詢時,記錄。有沒有什麼方法可以讓流式記錄在查詢中超級遲到,或者Apache Beam有可能正在處理記錄但很長一段時間沒有寫入記錄?我沒有應用任何開窗策略。

任何想法?

+0

你如何確定LastDeltaDate? –

+0

@BenChambers我已經更新了我的問題,並說明了如何確定LastDeltaDate。 – jimmy

回答

1

執行流式插入時,這些行可用於批量導出的速度有所延遲,如其文檔data availability中所述。

因此,在時間T2,您可能會將一堆行存儲在存儲在流緩衝區中的BigQuery中。然後,您從時間T1到T2運行一個批處理作業,但僅查看直到T2緩衝區的行。因此,每個增量運行緩衝區中的任何行都將被刪除。

您可能需要讓您選擇NowUTC意識到流緩衝區,以便下一個運行處理緩衝區內的行。

+0

謝謝。我記得在某處讀取數據流緩衝區中的數據會立即可用,但我猜BigQueryIO不算作查詢嗎?我猜測一個delta日期在BigQuery中不起作用,因爲不能依賴時間戳(遺憾的是BigQuery表沒有默認值)。我看到的唯一的其他選擇是始終將流式表與對帳表進行比較以複製任何新記錄。你有沒有別的想法? – jimmy

+0

您可以嘗試僅掃描表中的內容,而不是直到現在才進行掃描。看起來這是最多90分鐘。它看起來像是如果你發出一個table.get調用它會給你流媒體緩衝區上的屬性,包括「streamingBuffer.oldestEntryTime」 - 那裏最舊的條目的時間戳。如果您使用的是NowUTC而不是Now,那麼您將不會跳過緩衝區中當前的行,並且應該在下次掃描它們。 –

+0

在批處理中,BigQueryIO執行導出操作,然後從GCS中讀取文件,因爲這可以提高並行度。 –