gpt4 book ai didi

hadoop - 创建具有较大 (>1GB) BytesWritable 值大小的 SequenceFile 时出现 NegativeArraySizeException

转载 作者:可可西里 更新时间:2023-11-01 14:38:27 28 4
gpt4 key购买 nike

我尝试了不同的方法来创建一个大型的 Hadoop SequenceFile只是一个短的(<100 字节)键和一个大的(>1GB)值(BytesWriteable)。

以下示例适用于开箱即用:

https://svn.apache.org/repos/asf/hadoop/common/trunk/hadoop-mapreduce-project/hadoop-mapreduce-client/hadoop-mapreduce-client-jobclient/src/test/java/org/apache/hadoop/mapred/BigMapOutput.java

写入多个随机长度的键和值,总大小 >3GB。

然而,这不是我想要做的。所以我使用 hadoop 2.2.0 API 将其修改为:

      Path file = new Path("/input");
SequenceFile.Writer writer = SequenceFile.createWriter(conf,
SequenceFile.Writer.file(file),
SequenceFile.Writer.compression(CompressionType.NONE),
SequenceFile.Writer.keyClass(BytesWritable.class),
SequenceFile.Writer.valueClass(BytesWritable.class));
int numBytesToWrite = fileSizeInMB * 1024 * 1024;
BytesWritable randomKey = new BytesWritable();
BytesWritable randomValue = new BytesWritable();
randomKey.setSize(1);
randomValue.setSize(numBytesToWrite);
randomizeBytes(randomValue.getBytes(), 0, randomValue.getLength());
writer.append(randomKey, randomValue);
writer.close();

当 fileSizeInMB>700MB 时,我收到如下错误:

java.lang.NegativeArraySizeException
at org.apache.hadoop.io.BytesWritable.setCapacity(BytesWritable.java:144)
at org.apache.hadoop.io.BytesWritable.setSize(BytesWritable.java:123)
...

我看到正在讨论这个错误,但没有看到任何解决方案。请注意,int(2^32) 可以大到 2GB,它不应在 700MB 时失败。

如果您有其他方法可以创建如此大值(value)的SequenceFile,请指教。我尝试了其他方法,例如 IOutils.read from inputstream into a byte [],我得到了堆大小或 OOME。

最佳答案

只需使用 ArrayPrimitiveWritable 即可。

BytesWritable 中设置新容量会导致 int 溢出这里:

public void setSize(int size) {
if (size > getCapacity()) {
setCapacity(size * 3 / 2);
}
this.size = size;
}

700 Mb * 3 > 2Gb = int 溢出!

因此,您无法将超过 700 Mb 的数据反序列化(但可以写入和序列化)到 BytesWritable。

关于hadoop - 创建具有较大 (>1GB) BytesWritable 值大小的 SequenceFile 时出现 NegativeArraySizeException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24127304/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com