【问题标题】:Apache Beam Dataflow Bigquery Streming insertions out of memory errorApache Beam Dataflow Bigquery Streming 插入内存​​不足错误
【发布时间】:2022-11-26 08:47:12
【问题描述】:

使用 Apache Beam SDK for Java 2.29.0 将数据插入 Bigauqery 时,我间歇性地遇到数据流作业的内存不足问题。

这是堆栈跟踪

    Error message from worker: java.lang.RuntimeException: java.lang.OutOfMemoryError: unable to create native thread: possibly out of memory or process/resource limits reached
        org.apache.beam.sdk.io.gcp.bigquery.BigQueryServicesImpl$DatasetServiceImpl.insertAll(BigQueryServicesImpl.java:982)
        org.apache.beam.sdk.io.gcp.bigquery.BigQueryServicesImpl$DatasetServiceImpl.insertAll(BigQueryServicesImpl.java:1022)
        org.apache.beam.sdk.io.gcp.bigquery.BatchedStreamingWrite.flushRows(BatchedStreamingWrite.java:375)
        org.apache.beam.sdk.io.gcp.bigquery.BatchedStreamingWrite.access$800(BatchedStreamingWrite.java:69)
        org.apache.beam.sdk.io.gcp.bigquery.BatchedStreamingWrite$BatchAndInsertElements.finishBundle(BatchedStreamingWrite.java:271)
Caused by: java.lang.OutOfMemoryError: unable to create native thread: possibly out of memory or process/resource limits reached
        java.base/java.lang.Thread.start0(Native Method)
        java.base/java.lang.Thread.start(Thread.java:803)
        java.base/java.util.concurrent.ThreadPoolExecutor.addWorker(ThreadPoolExecutor.java:937)
        java.base/java.util.concurrent.ThreadPoolExecutor.execute(ThreadPoolExecutor.java:1343)
        java.base/java.util.concurrent.AbstractExecutorService.submit(AbstractExecutorService.java:129)
        java.base/java.util.concurrent.Executors$DelegatedExecutorService.submit(Executors.java:724)
        com.google.api.client.http.javanet.NetHttpRequest.writeContentToOutputStream(NetHttpRequest.java:188)
        com.google.api.client.http.javanet.NetHttpRequest.execute(NetHttpRequest.java:117)
        com.google.api.client.http.javanet.NetHttpRequest.execute(NetHttpRequest.java:84)
        com.google.api.client.http.HttpRequest.execute(HttpRequest.java:1012)
        com.google.api.client.googleapis.services.AbstractGoogleClientRequest.executeUnparsed(AbstractGoogleClientRequest.java:514)
        com.google.api.client.googleapis.services.AbstractGoogleClientRequest.executeUnparsed(AbstractGoogleClientRequest.java:455)
        com.google.api.client.googleapis.services.AbstractGoogleClientRequest.execute(AbstractGoogleClientRequest.java:565)
        org.apache.beam.sdk.io.gcp.bigquery.BigQueryServicesImpl$DatasetServiceImpl.lambda$insertAll$1(BigQueryServicesImpl.java:906)
        org.apache.beam.sdk.io.gcp.bigquery.BigQueryServicesImpl$BoundedExecutorService$SemaphoreCallable.call(BigQueryServicesImpl.java:1492)
        java.base/java.util.concurrent.FutureTask.run(FutureTask.java:264)
        java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1128)
        java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:628)
        java.base/java.lang.Thread.run(Thread.java:834)

我尝试增加工作节点大小仍然看到同样的问题。

【问题讨论】:

  • 您使用的是 Batch 还是 Streaming?您可以考虑使用最新版本的 beam 吗?您使用的是什么机器类型?
  • 您可以共享代码 sn-p 以查看操作是否昂贵吗?

标签: google-bigquery google-cloud-dataflow apache-beam apache-beam-io


【解决方案1】:

我真的建议您将Beam 版本升级到 2.42.0(最新)。

还要检查你是否有像groupBygroupByKey这样的聚合,它们在工作人员的内存中是昂贵的。

您还可以使用 Dataflow prime,这是 Dataflow 的最后一个执行引擎,可以防止在具有垂直自动缩放功能的工作人员中出现类似 outOfMemory 的错误:

dataflow prime

Dataflow prime 可以通过程序参数启用,例如 Beam Java

--dataflowServiceOptions=enable_prime

Dataflow prime 在这种情况下会有所帮助,但如果需要,您必须检查和优化您的工作,并尽可能避免代价高昂的操作(内存泄漏、无用的聚合、代价高昂的序列化……)

【讨论】:

    【解决方案2】:

    OutOfMemory 问题可能很难调试,因为您看到的症状可能与内存压力的来源完全无关。因此,当您尝试在 insertAll 方法中创建线程时,您的管道会抛出此错误,但您的大部分内存使用可能来自管道的其他部分。

    https://cloud.google.com/community/tutorials/dataflow-debug-oom-conditions 有一些关于调试内存问题的深入建议

    如果内存压力来自 BigQueryIO,请查看各种配置选项,例如 maxStreamingRowsToBatch

    【讨论】:

      猜你喜欢
      • 2020-03-31
      • 2019-02-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-10-17
      • 2021-04-29
      • 2018-05-22
      相关资源
      最近更新 更多