如何在Hadoop Writable中序列化非常大的对象

时间:2014-08-22 08:34:35

标签: java hadoop serialization mapreduce writable

Hadoop Writable接口依赖于"public void write(DataOutput out)"方法。它看起来像DataOutput接口,Hadoop使用DataOutputStream,它在封面下使用一个简单的数组。

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

  

引起:java.lang.OutOfMemoryError:请求的数组大小超过VM   限制           在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)           在java.io.DataOutputStream.write(DataOutputStream.java:107)           在java.io.FilterOutputStream.write(FilterOutputStream.java:97)

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

如果我无法减少需要序列化的对象的大小(因为reducer通过组合对象数据来构造此对象),我应该尝试解决这个问题?

1 个答案:

答案 0 :(得分:0)

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