【问题标题】:File structure of Apache Beam DynamicDestinations write to BigQueryApache Beam DynamicDestinations 的文件结构写入 BigQuery
【发布时间】:2018-02-19 14:26:51
【问题描述】:
我正在使用 DynamicDestinations(来自 BigQueryIO)将数据从一个 Cassandra 表导出到多个 Google BigQuery 表。该过程包括几个步骤,包括将准备好的数据写入 Google Cloud Storage(作为 JSON 格式的文件),然后通过加载作业将文件加载到 BQ。
问题是导出过程在最后一步(将文件从 Google Storage 加载到 BQ)中出现内存不足错误。但是有准备好的文件,其中保留了 GCS 中的所有数据。 BigQueryWriteTemp 位置有 3 个目录:
还有很多名字不明显的文件:
问题是文件的存储结构是什么?如何将文件与他们准备的表(表名)匹配?如何使用这些文件从加载作业步骤继续导出过程?我可以为此使用一些 Beam 代码吗?
【问题讨论】:
标签:
google-bigquery
google-cloud-storage
apache-beam
【解决方案1】:
如果您使用的是 Beam 2.3.0 或更早版本,这些文件包含要使用其加载作业 API 导入 BigQuery 的 JSON 数据。然而:
- 一般来说,这是一个您不能依赖的实现细节。它很可能在 Beam 的未来版本中发生变化(JSON 效率极低)。
- 无法将这些文件与它们打算用于的表进行匹配 - 这些表存储在失败的管道的内部状态中。
- 也无法知道有多少数据写入这些文件,有多少没有。这些文件可能仅包含部分数据:您的管道可能在创建某些文件之前失败,或者在其中一些文件已加载到 BigQuery 并被删除之后失败。
基本上,您需要重新运行管道并修复 OOM 问题以使其成功。
对于调试 OOM 问题,我建议使用堆转储。 Dataflow 可以使用--dumpHeapOnOOM --saveHeapDumpsToGcsPath=gs://my_bucket/ 将堆转储写入 GCS。您可以使用任何 Java 内存分析器(例如 Eclipse MAT 或 YourKit)检查这些转储。您还可以将代码作为单独的 SO 问题发布,并寻求减少内存使用量的建议。