1 つの短い (<100 バイト) キーと 1 つの大きな (>1GB) 値 (BytesWriteable) を持つ大きな Hadoop SequenceFile を作成するさまざまな方法を試しました。
次のサンプルは、すぐに使用できます。
合計サイズが 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 で失敗することはありません。
このような大きな値の SequenceFile を作成する別の方法がある場合は、アドバイスしてください。入力ストリームからバイト [] への IOutils.read などの他のアプローチを試してみたところ、ヒープ サイズまたは OOME が得られました。