【问题标题】:How to serialize very large object in Hadoop Writable如何在 Hadoop Writable 中序列化非常大的对象
【发布时间】:2014-10-16 01:25:34
【问题描述】:

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

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

原因:java.lang.OutOfMemoryError:请求的数组大小超过 VM 限制 在 java.util.Arrays.copyOf(Arrays.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 通过组合对象数据来构造这个对象),我应该如何解决这个问题?

【问题讨论】:

标签: java hadoop serialization mapreduce writable


【解决方案1】:

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

【讨论】:

  • 考虑写下为什么应该使用这些键
猜你喜欢
  • 2016-09-29
  • 1970-01-01
  • 1970-01-01
  • 2011-04-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-10-17
相关资源
最近更新 更多