簡體   English   中英

如何使用 Apache Beam 管理背壓

[英]How to manage backpressure with Apache Beam

我有非常基本的 apache 光束管道,它在 GCP Dataflow 上運行並從 PubSub 讀取一些數據,將其轉換並將其寫入 Postgres DB。 所有這些都是通過 Apache Beam 的標准讀取器/寫入器組件完成的。 問題是當我的管道開始接收大量數據時,由於等待 ShareLocks,我的 Postgres 端會出現死鎖錯誤。

很明顯,這樣的事情發生是因為在 Postgres 端溢出。 我的管道試圖一次寫得太快和太多的東西,所以為了避免這種情況,它應該放慢速度。 因此,我們可以使用諸如背壓之類的機制。 我試圖挖掘有關 Apache Beam 背壓配置的任何信息,不幸的是,官方文檔似乎對此類問題保持沉默。

我對以下異常感到不知所措:

java.sql.BatchUpdateException: Batch entry <NUMBER>
<MY_STATEMENT>
 was aborted: ERROR: deadlock detected
  Detail: Process 87768 waits for ShareLock on transaction 1939992; blocked by process 87769.
Process 87769 waits for ShareLock on transaction 1939997; blocked by process 87768.
  Hint: See server log for query details.
  Where: while inserting index tuple (5997152,9) in relation "<MY_TABLE>"  Call getNextException to see other errors in the batch.

我想知道是否有任何背壓工具包或類似的東西可以幫助我在不編寫自己的PostgresIO.Writer情況下管理我的問題。

非常感謝。

假設您使用JdbcIO寫入Postgres,您可以嘗試增加batch size(參見withBatchSize(long batchSize) ),默認為1K記錄,可能還不夠。

此外,如果出現 SQL 異常,並且您想要重試,那么您需要確保使用正確的重試策略(請參閱withRetryStrategy(RetryStrategy retryStrategy) )。 在這種情況下,將應用FluentBackoff

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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