Как сериализовать очень большой объект в Hadoop Writable

Интерфейс Hadoop Writable опирается на "public void write(DataOutput out)" метод. Похоже, что за интерфейсом DataOutput, Hadoop использует DataOutputStream, который использует простой массив под крышкой.

Когда я пытаюсь записать много данных в DataOutput в моем редукторе, я получаю:

Причина: java.lang.OutOfMemoryError: Запрашиваемый размер массива превышает ограничение виртуальной машины в 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:utream.jput:utreamOjter_Outter.jput:utreamOjterter.jput:OutForm.jput:OutForm.jput:OutOutter.Jput:OutForm.jput:Out.Outter.jputtOutForm.jtp0..java:97)

Похоже, система не может выделить непрерывный массив запрошенного размера. По-видимому, увеличение размера кучи, доступного для редуктора, не помогает - оно уже составляет 84 ГБ (-Xmx84G)

Если я не могу уменьшить размер объекта, который мне нужно сериализовать (поскольку редуктор создает этот объект путем объединения данных объекта), что я должен попытаться обойти эту проблему?

1 ответ

Я думаю, что вы должны использовать -Xms, например -Xms40G, а не -Xmx84G

Другие вопросы по тегам