首页 文章

Apache Beam DynamicDestinations的文件结构写入BigQuery

提问于
浏览
0

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

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

enter image description here

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

enter image description here

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

1 回答

  • 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问题发布,并请求减少其内存使用量的建议 .

相关问题