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

标签 java hadoop serialization mapreduce writable

Hadoop Writable 接口(interface)依赖于“public void write(DataOutput out)” 方法。看起来在DataOutput接口(interface)的背后,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)

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

最佳答案

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

关于java - 如何在 Hadoop Writable 中序列化非常大的对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25442809/

相关文章:

java - Spring AMQP : MessageListener not receiving any messages

java - 如何在 Java 中使用三重 des(3des) 的三个键

java - hadoop mapreduce 和 s3 的多个输入文件夹

c# - JSON.NET 根标记和反序列化

java - 尝试视频通话时,Android WireApp记录UnsatisfiedLink错误:“wcall_set_video_send_state”

java - 无法计算表达式方法抛出 'org.hibernate.exception.GenericJDBCException' 异常

java - 线程 "main"java.lang.NoClassDefFoundError : org/apache/hadoop/tracing/SpanReceiverHost 中的异常

hadoop - Hive View 分区

java - 家庭作业! ObjectInputStream(new FileInputStream ("filename") 永远不会停止读取

javascript - 在 PHP 中使用序列化 jQuery 传递多个参数