Apache Beam DynamicDestinations的文件结构写入BigQuery

时间:2018-02-19 14:26:52

标签: google-bigquery google-cloud-storage apache-beam

我正在使用DynamicDestinations(来自BigQueryIO)将数据从一个Cassandra表导出到多个Google BigQuery表。该过程包括几个步骤,包括将准备好的数据写入Google云端存储(作为JSON格式的文件),然后通过加载作业将文件加载到BQ。

问题是导出过程已在最后一步因内存不足错误而结束(将文件从Google Storage加载到BQ)。但是有准备好的文件,其中包含GCS中的所有数据。 BigQueryWriteTemp位置有3个目录:

enter image description here

还有很多名字不明显的文件:

enter image description here

问题是文件的存储结构是什么?如何将文件与他们准备的表(表名)进行匹配?如何使用这些文件从加载作业步骤继续导出过程?我可以使用一些Beam代码吗?

1 个答案:

答案 0 :(得分:2)

如果您使用Beam 2.3.0或更早版本,这些文件包含要使用其加载作业API导入BigQuery的JSON数据。但是:

  • 这是一个你不能依赖的实现细节。在未来的Beam版本中很可能会发生变化(JSON非常低效)。
  • 无法将这些文件与其预期的表匹配 - 这些表存储在失败的管道的内部状态中。
  • 也无法知道有多少数据写入这些文件,也没有多少数据写入。这些文件可能只包含部分数据:在创建某些文件之前,或者在某些文件已经加载到BigQuery中并删除之后,管道可能会失败。

基本上,您需要重新运行管道并修复OOM问题才能成功。

为了调试OOM问题,我建议使用堆转储。 Dataflow可以使用--dumpHeapOnOOM --saveHeapDumpsToGcsPath=gs://my_bucket/将堆转储写入GCS。您可以使用任何Java内存分析器(例如Eclipse MAT或YourKit)检查这些转储。您也可以将您的代码作为单独的SO问题发布,并请求减少其内存使用量的建议。