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