python-3.x - 优化 BigQuery 资源的使用,使用 Google Dataflow 从 GCS 加载 200 万个 JSON 文件
问题描述
我有一个庞大的数据库,由大约 240 万个 JSON 文件组成,这些文件本身包含几条记录。我创建了一个简单的 apache-beam 数据管道(如下所示),它遵循以下步骤:
- 使用 glob 模式从 GCS 存储桶中读取数据。
- 从 JSON 数据中提取记录。
- 转换数据:将字典转换为 JSON 字符串、解析时间戳等。
- 写入 BigQuery。
# Pipeline
pipeline_options = PipelineOptions(pipeline_args)
pipeline_options.view_as(SetupOptions).save_main_session = save_main_session
p = beam.Pipeline(options=pipeline_options)
# Read
files = p | 'get_data' >> ReadFromText(files_pattern)
# Transform
output = (files
| 'extract_records' >> beam.ParDo(ExtractRecordsFn())
| 'transform_data' >> beam.ParDo(TransformDataFn()))
# Write
output | 'write_data' >> WriteToBigQuery(table=known_args.table,
create_disposition=beam.io.BigQueryDisposition.CREATE_NEVER,
write_disposition=beam.io.BigQueryDisposition.WRITE_EMPTY,
insert_retry_strategy='RETRY_ON_TRANSIENT_ERROR',
temp_file_format='NEWLINE_DELIMITED_JSON')
# Run
result = p.run()
result.wait_until_finish()
我已经用最小的样本数据集测试了这个管道,并且按预期工作。但我对 BigQuery 资源和配额的最佳使用持怀疑态度。批量加载配额非常严格,并且由于要解析和加载的文件数量庞大,我想知道我是否遗漏了一些可以保证管道将遵守配额并以最佳方式运行的设置。我不想超过配额,因为我在同一个项目中运行 BigQuery 的其他负载。
我还没有完全理解WriteToBigQuery()
转换的某些参数,特别batch_size
是 、max_file_size
和max_files_per_bundle
,或者它们是否有助于优化 BigQuery 的加载作业。你能帮我解决这个问题吗?
更新
我不仅关心 BigQuery 配额,而且该管道使用的其他资源的 GCP 配额也是一个问题。
我尝试在目标数据(约 240 万个文件)上运行我的简单管道,但我收到以下警告消息:
项目 [my-project] 的配额不足,无法使用区域 us-central1 中的 1 个实例执行此工作流。配额摘要(必需/可用):1/16 个实例、1/16 个 CPU、250/2096 个磁盘 GB、0/500 SSD 磁盘 GB、1/99 个实例组、1/49 个托管实例组、1/99 个实例模板、 1/0 正在使用的 IP 地址。有关请求更多配额的信息,请参阅https://cloud.google.com/compute/docs/resource-quotas 。
我不完全理解那个消息。该过程成功激活了 8 个工作人员,并使用了 8 个可用的正在使用的 IP 地址中的 8 个。这是一个问题吗?我该如何解决?
解决方案
如果您担心加载作业配额,您可以尝试将数据流式传输到具有较少限制性配额策略的 bigquery 中。
要实现您想做的事情,您可以尝试 Google 提供的模板或仅参考他们的代码。
最后但并非最不重要的一点是,可以在Google BigQuery I/O 连接器上找到更详细的信息。