Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/315.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 当processElement的输出为fat时处理内存不足异常_Java_Google Cloud Dataflow - Fatal编程技术网

Java 当processElement的输出为fat时处理内存不足异常

Java 当processElement的输出为fat时处理内存不足异常,java,google-cloud-dataflow,Java,Google Cloud Dataflow,当我使用数据流时,我需要创建一些字符串行,这些行的用户id列表用逗号分隔。然后在GCS中写入结果。不幸的是,在DoFn的processElement中,每一行都有太多的用户,这导致java.lang.OutOfMemoryError。有什么方法可以避免OutOfMemory异常并成功地用文本文件为GCS中的每一行写入胖行?我的源代码如下。 PCollection<KV<String, String>> rows = someData .apply(Combine.


当我使用数据流时,我需要创建一些字符串行,这些行的用户id列表用逗号分隔。然后在GCS中写入结果。
不幸的是,在DoFn的processElement中,每一行都有太多的用户,这导致java.lang.OutOfMemoryError。
有什么方法可以避免OutOfMemory异常并成功地用文本文件为GCS中的每一行写入胖行?
我的源代码如下。

PCollection<KV<String, String>> rows = someData
    .apply(Combine.<String, String>perKey(new CombineUserIds()));

public static class CombineUserIds implements SerializableFunction<Iterable<String>, String> {
  private static final long serialVersionUID = 0;

  @Override
  public String apply(Iterable<String> userIdList) {
    return Joiner.on(",").join(userIdList);
  }
}
PCollection行=someData
.apply(Combine.perKey(新combineUserId());
公共静态类CombineUserId实现SerializableFunction{
私有静态最终长serialVersionUID=0;
@凌驾
公共字符串应用(Iterable userIdList){
返回Joiner.on(“,”).join(userIdList);
}
}
这里,源代码中的
someData
PCollection
类型,其键是group\u id,值是user\u id。
下面是整个错误消息
(b997767fac436e5c):java.lang.OutOfMemoryError:java.lang.AbstractStringBuilder.expandCapacity(AbstractStringBuilder.java:137)处java.lang.AbstractStringBuilder.ensureCapacityInternal(AbstractStringBuilder.java:121)处的java堆空间(AbstractStringBuilder.java:421)位于java.lang.StringBuilder.append(StringBuilder.java:136)位于java.lang.StringBuilder.append(StringBuilder.java:76)位于java.lang.AbstractStringBuilder.append(AbstractStringBuilder.java:457)位于java.lang.StringBuilder.append(StringBuilder.java:166)位于java.lang.StringBuilder.append(StringBuilder.java:76)com.google.common.base.Joiner.appendTo(Joiner.java:111)com.google.common.base.Joiner.appendTo(Joiner.java:152)com.google.common.base.Joiner.join(Joiner.java:193)com.google.common.base.Joiner.join(Joiner.java:183)com.moloco.dataflow.ml.adhoc.GenerateMLUserProfileSet$CombineUserIds.apply(generatemluserfileset.java:189)com.google.cloud.dataflow.sdk.transforms.Combine$IterableCombineFn.mergeToSingleton(Combine.java:1613)com.google.cloud.dataflow.sdk.transforms.Combine$IterableCombineFn.mergeToSingleton(Combine.java:1613)com.google.cloud.dataflow.sdk.transforms.Combine$IterableCombineFn.mergecongregators(Combine.java:1591)com.google.cloud.dataflow.sdk.transforms.com.google.cloud.dataflow.sdk.transforms.com.google.cloud.dataflow.sdk.converators.com.google.cloud.dataflow.sdk.runners.worker.groupalsobywindowspardoffactory.MergingKeyedCombineFn.extractOutputcom.google.cloud.dataflow.sdk.runners.worker.groupalsobywindowspardofFactory$MergingKeyedCombineFn.extractOutput(groupalsobywindowspardofFactory.java:249)com.google.cloud.dataflow.sdk.util.groupalsobywindowspardofFactory$mergingKeyedCombinefnRunner.extractOutputcom.google.cloud.dataflow.sdk.util.GroupAlsoByWindowsAndCombineDoFn.closeWindow(GroupAlsoByWindowsAndCombineDoFn.java:206)com.google.cloud.dataflow.sdk.util.GroupAlsoByWindowsAndCombineDoFn.processElement(GroupAlsoByWindowsAndCombineDoFn.java:192)com.google.cloud.dataflow.sdk.util.SimpleDofRunner.invokeProcessElement(SimpleDofRunner.java:49)com.google.cloud.dataflow.sdk.util.DofRunnerbase.processElement(DofRunnerbase.java:138)com.google.cloud.dataflow.sdk.runners.worker.SimpleParDoFn.processElement(SimpleParDoFn.java:190)com.google.cloud.dataflow.sdk.runners.worker.ForwardingParDoFn.processElement(ForwardingParDoFn.java:42)com.google.cloud.dataflow.sdk.runners.worker.dataflowworkerlogginpardofn.processElement(DataflowWorkerLoggingParDoFn.java:47)com.google.cloud.dataflow.sdk.util.common.worker.pardoopation.process(pardoopation.java:53)Oracle提供的com.google.cloud.dataflow.sdk.util.common.worker.OutputReceiver.process(OutputReceiver.java:52)com.google.cloud.dataflow.sdk.util.common.worker.ReadOperation.runReadLoop(ReadOperation.java:226)

线程名为java.lang.OutOfMemoryError:java堆空间中出现异常

原因:Java堆空间的详细信息表明对象无法访问 在Java堆中分配。此错误不一定意味着 内存泄漏。问题可以简单到配置问题, 其中指定的堆大小(或默认大小,如果不是 指定的)不适用于该应用程序

解决方案1:增加JVM堆大小,如下所示

您可以指定每个项目需要多少堆空间

以下是Eclipse的示例:

用鼠标右键单击

Run As - Run Configuration - Arguments - Vm Arguments, 
然后加上这个

-Xmx1024 

解决方案2(仅在尝试解决方案1之后):

同样来自甲骨文

3.4.3监控待完成的对象 当抛出OutOfMemoryError异常并显示“Java堆空间”>详细信息时 消息,原因可能是过度使用终结器。要诊断 这样,您就可以使用多个选项来监视对象的数量 正在等待定稿的

管理工具可用于监控 正在挂起终结的对象。此工具报告挂起的 “摘要”选项卡窗格上内存统计信息中的终结计数。 该计数是近似值,但可用于表征 应用程序,并了解它是否在很大程度上依赖于最终确定

在Oracle Solaris和Linux操作系统上,可以使用jmap实用程序 与-finalizerinfo选项一起使用,以打印有关对象的信息 等待最后定稿

应用程序可以报告待处理对象的大致数量 使用的getObjectPendingFinalizationCount方法完成 java.lang.management.MemoryMXBean类。指向API的链接
-Xmx2048m