Как получить размер объекта ParquetWriter в памяти перед его закрытием и записью на диск?

Я читаю сообщения Avro из потока и записываю их в файл Parquet с помощью parquet.hadoop.ParquetWriter. Я пытаюсь увеличить размер выходных файлов выше порогового значения. проблема в том, что ParquetWriter хранит все в памяти и записывает это на диск только в конце, когда модуль записи закрыт. Согласно документации Parquet, данные записываются в объект памяти в окончательном формате, что означает, что размер объекта в памяти совпадает с окончательным размером на диске. У меня вопрос, как получить размер записанных данных в памяти, чтобы принять решение о закрытии писателя?

Я попытался использовать размер байта сообщений avro, которые я пишу в ParquetWriter, в качестве оценки размера файла Parquet writer, но он сильно отличается от размера parquet writer из-за другого способа хранения данных parquet (столбчатый формат). Вот псевдокод того, что я сделал:

    ParquetWriter parquetWriter = new ParquetWriter(..., BLOCK_SIZE, PAGE_SIZE);    
    long bytesWrittenSofar = 0;

    public long getLength(){
        return bytesWrittenSofar;
    }
    public void write(org.apache.avro.generic.GenericRecord record){
        parquetWriter.write(record);
        bytesWrittenSofar += avroToBytes(record).length;
    }

    public static byte[] avroToBytes(GenericRecord record){
        GenericDatumWriter<GenericRecord> writer =
            new GenericDatumWriter<GenericRecord>(record.getSchema());
        ByteArrayOutputStream out = new ByteArrayOutputStream();
        BinaryEncoder encoder = EncoderFactory.get().binaryEncoder(out, null);
        writer.write(record, encoder);
        encoder.flush();
        out.close();
        return out.toByteArray();
    } 

Оказалось, что значение, которое я получаю от getLength (), сильно отличается от фактического размера файла parquet. Я знаю, что схема будет добавлена ​​в конец файла, но это очень мало. Чтобы дать вам представление, когда getLength () сообщает о 130 МБ, фактический размер файла составляет всего 80 МБ.


person reza    schedule 05.03.2015    source источник


Ответы (2)


Я не нашел способа получить доступ к памяти, используемой ParquetWriter. Вместо этого я закончил профилирование размеров загруженных файлов и количества записанных в них записей. Используя предыдущие данные и подсчитав количество записей, записанных в текущий файл, я оценил размер текущего файла, находящегося в процессе выполнения. Это оказалось намного ближе к реальному размеру файла, чем любая другая попытка. Однако это сильно зависит от приложения и вариаций в записях, которые вы пишете.

person reza    schedule 07.03.2015

Скорее всего, это одно из более поздних дополнений к API, которое не было доступно на момент написания вопроса.

Метод _ 1_ должен дать вам то, что вам нужно.

person Tim Van Laer    schedule 10.10.2019