我有一个从 Pub/Sub 读取的管道,然后使用 1 分钟的窗口并获取每个键的最新元素并将该元素插入到 BigQuery。代码非常简单。
由于 WriteToBigQuery
内的批处理对我不起作用,它始终为 1,因此我决定在该步骤之前使用 BatchElements
,然后使用 FlatMap
将批处理展平并存储事件到 BigQuery。有了这个,插入是分批完成的,我猜这是因为正在创建包。代码如下:
tagged_events[table]
| f"Reshuffle to {table}" >> Reshuffle()
| f"Batch {table} elements"
>> BatchElements(
min_batch_size=BIGQUERY_INSERT_MAX_BATCH_SIZE, max_batch_size=BIGQUERY_INSERT_MAX_BATCH_SIZE
)
| f"Flatten batch of {table}" >> FlatMap(flatten_list)
| f"Write to {table}"
>> WriteToBigQuery(
table=f"{self.project}:{self.dataset}.{table}",
create_disposition=BigQueryDisposition.CREATE_NEVER,
write_disposition=BigQueryDisposition.WRITE_APPEND,
insert_retry_strategy=RetryStrategy.RETRY_NEVER,
ignore_insert_ids=True,
batch_size=BIGQUERY_INSERT_MAX_BATCH_SIZE,
)
BIGQUERY_INSERT_MAX_BATCH_SIZE
是 500。几天后,作业收到 OOM 错误,并终止了线束进程。我们正在使用 n2-standard-4
机器来完成这项工作,最大工人数为 20。
降低批量大小会对此有帮助吗?或者我还能做些什么来避免这个问题?