hadoop可写接口依赖于 "public void write(DataOutput out)"
方法。在dataoutput接口后面,hadoop使用dataoutputstream,它在封面下使用了一个简单的数组。
当我尝试在我的reducer中的dataoutput中写入大量数据时,我得到:
原因:java.lang.outofmemoryerror:请求的数组大小超出了java.util.arrays.copyof(arrays)的vm限制。java:3230)在java.io.bytearrayoutputstream.grow(bytearrayoutputstream。java:113)在java.io.bytearrayoutputstream.ensurecapacity(bytearrayoutputstream。java:93)在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条答案
按热度按时间vsaztqbk1#
我认为您应该使用-xms例如-xms40g而不是-xmx84g