Hadoop Writable 接口依赖于"public void write(DataOutput out)"
方法。看起来在 DataOutput 接口后面,Hadoop 使用了 DataOutputStream,它在封面下使用了一个简单的数组。
当我尝试在减速器的 DataOutput 中写入大量数据时,我得到:
原因:java.lang.OutOfMemoryError:在 java.io.ByteArrayOutputStream.grow(ByteArrayOutputStream.java:113) 在 java.io.ByteArrayOutputStream.grow(ByteArrayOutputStream.java:113) 的 java.util.Arrays.copyOf(Arrays.java:3230) 请求的数组大小超过 VM 限制。 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)
看起来系统无法分配请求大小的连续数组。显然,增加减速器可用的堆大小没有帮助 - 它已经是 84GB (-Xmx84G)
如果我不能减小我需要序列化的对象的大小(因为 reducer 通过组合对象数据来构造这个对象),我应该如何解决这个问题?