2

长时间运行我的流式数据流作业往往会导致“超出 GC 开销限制”错误,从而导致作业停止。我怎样才能最好地继续调试呢?

java.lang.OutOfMemoryError: GC overhead limit exceeded
    at com.google.cloud.dataflow.worker.repackaged.com.google.common.collect.HashBasedTable.create (HashBasedTable.java:76)
    at com.google.cloud.dataflow.worker.WindmillTimerInternals.<init> (WindmillTimerInternals.java:53)
    at com.google.cloud.dataflow.worker.StreamingModeExecutionContext$StepContext.start (StreamingModeExecutionContext.java:490)
    at com.google.cloud.dataflow.worker.StreamingModeExecutionContext.start (StreamingModeExecutionContext.java:221)
    at com.google.cloud.dataflow.worker.StreamingDataflowWorker.process (StreamingDataflowWorker.java:1058)
    at com.google.cloud.dataflow.worker.StreamingDataflowWorker.access$1000 (StreamingDataflowWorker.java:133)
    at com.google.cloud.dataflow.worker.StreamingDataflowWorker$8.run (StreamingDataflowWorker.java:841)
    at java.util.concurrent.ThreadPoolExecutor.runWorker (ThreadPoolExecutor.java:1142)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run (ThreadPoolExecutor.java:617)
    at java.lang.Thread.run (Thread.java:745)
  • 职位编号:2018-02-06_00_54_50-15974506330123401176
  • SDK:适用于 Java 2.2.0 的 Apache Beam SDK
  • Scio 版本:0.4.7
4

1 回答 1

3

我遇到过几次这个问题。我的方法通常从尝试隔离导致 Dataflow 中的内存错误的转换步骤开始。这是一个较长的过程,但您通常可以有根据地猜测哪个是有问题的转换。移除转换,执行管道,并检查错误是否仍然存在。

一旦我确定了有问题的转换,我就会开始查看任何内存效率低下的实现。这通常与初始化对象(内存分配)或变换具有非常高扇出的设计有关;创建一堆输出。但它可能像字符串操作一样微不足道。

从这里开始,只需继续隔离问题即可。数据流确实有内存限制。您可能会增加支持工作人员的 Compute Engine 实例的硬件。但是,这不是一个可扩展的解决方案。

您还应该考虑仅使用 Apache Beam Java 来实现管道。这将排除 Scio 的问题。但通常情况并非如此。

于 2018-02-22T15:50:27.600 回答