【问题标题】:GCP Dataflow running streaming inserts into BigQuery: GC ThrashingGCP Dataflow 在 BigQuery 中运行流式插入:GC Thrashing
【发布时间】:2019-11-11 09:35:16
【问题描述】:

我将 Apache Beam 2.13.0 与 GCP Dataflow 运行器一起使用。

我在从批处理管道流式传输到 BigQuery 时遇到问题:

PCollection<BigQueryInsertError> stageOneErrors =
  destinationTableSelected
    .apply("Write BQ Attempt 1",
      BigQueryIO.<KV<TableDestination, TableRow>>write()
                .withMethod(STREAMING_INSERTS)
                .to(new KVTableDestination())
                .withFormatFunction(new KVTableRow())
                .withExtendedErrorInfo()
                .withFailedInsertRetryPolicy(InsertRetryPolicy.neverRetry())
                .withCreateDisposition(CreateDisposition.CREATE_NEVER)
                .withWriteDisposition(WriteDisposition.WRITE_APPEND))
                .getFailedInsertsWithErr();

错误:

 Shutting down JVM after 8 consecutive periods of measured GC thrashing. 
 Memory is used/total/max = 15914/18766/18766 MB, 
 GC last/max = 99.17/99.17 %, #pushbacks=0, gc thrashing=true. 
 Heap dump not written.

相同的代码在流模式下正确工作(如果省略了显式方法设置)。

该代码适用于相当小的数据集(少于 200 万条记录)。超过 250 万失败。

从表面上看,它似乎与此处描述的问题类似:Shutting down JVM after 8 consecutive periods of measured GC thrashing

创建一个单独的问题以添加更多详细信息。

我能做些什么来解决这个问题吗?看起来问题出在 BigQueryIO 组件本身 - GroupBy 键失败。

【问题讨论】:

    标签: google-cloud-platform google-bigquery google-cloud-dataflow


    【解决方案1】:

    包含 GroupByKey 的转换的问题在于,它会等到 所有 接收到当前窗口的数据后再进行分组。

    在 Streaming 模式下,这通常很好,因为传入的元素被窗口化到单独的窗口中,因此 GroupByKey 只对一小块(ish)数据进行操作。

    然而,在批处理模式下,当前窗口是全局窗口,这意味着 GroupByKey 将等待整个输入数据集被读取和接收,然后才开始执行分组。如果输入数据集很大,那么您的工作人员将耗尽内存,这就解释了您在此处看到的情况。

    这就引出了一个问题:为什么在处理 Batch 数据时使用 BigQuery Streaming 插入?流式插入是 relatively expensive(与免费的批量相比!)和 have smaller quota/limits 而不是批量导入:即使您解决了您看到的问题,Bigquery 本身可能还有更多问题尚未发现。.

    【讨论】:

    • 谢谢!挑战在于插入的继承代码 - 围绕它有大量错误处理和自定义逻辑。不幸的是,不能用批量加载重新实现。有没有办法摆脱批量插入的全局窗口?
    • 如果您在传入的数据中有一些与时间相关的东西,您可以使用窗口函数将数据拆分为窗口......但它仍然值得努力重构使用批处理...
    • 感谢您的建议,不,传入数据中没有具体内容。但我可以人为地设置一些东西。我试过这个,并写了一些结果。但是管道还是崩溃了。困惑。
    【解决方案2】:

    在与支持人员和开发人员进行广泛讨论后,我们得知不鼓励使用来自批处理管道的 BigQuery 流式入口,目前(从 2.13.0 开始)不支持。

    【讨论】:

      猜你喜欢
      • 2019-05-01
      • 1970-01-01
      • 2021-12-02
      • 2020-06-09
      • 1970-01-01
      • 1970-01-01
      • 2021-11-20
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多