有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java如何在Hadoop中序列化非常大的可写对象

Hadoop可写接口依赖于"public void write(DataOutput out)"方法。在DataOutput接口后面,Hadoop使用DataOutputStream,它在封面下使用了一个简单的数组

当我尝试在我的reducer中的DataOutput中写入大量数据时,我得到:

Caused by: java.lang.OutOfMemoryError: Requested array size exceeds VM limit at java.util.Arrays.copyOf(Arrays.java:3230) at java.io.ByteArrayOutputStream.grow(ByteArrayOutputStream.java:113) at java.io.ByteArrayOutputStream.ensureCapacity(ByteArrayOutputStream.java:93) at java.io.ByteArrayOutputStream.write(ByteArrayOutputStream.java:140) at java.io.DataOutputStream.write(DataOutputStream.java:107) at java.io.FilterOutputStream.write(FilterOutputStream.java:97)

看起来系统无法分配请求大小的连续数组。 显然,增加可用于reducer的堆大小没有帮助-它已经达到84GB(-Xmx84G)

如果我无法减小需要序列化的对象的大小(因为缩减器通过组合对象数据来构造此对象),我应该如何解决此问题


共 (1) 个答案

  1. # 1 楼答案

    我认为你应该使用-Xms例如-Xms40G而不是-Xmx84G