Производит ли двоичное кодирование данных AVRO?

В одном из наших проектов мы используем Kafka с AVRO для передачи данных по всем приложениям. Данные добавляются к объекту AVRO, и объект записывается в двоичный код для записи в Kafka. Мы используем двоичное кодирование, поскольку оно обычно упоминается как минимальное представление по сравнению с другими форматами.

Данные обычно представляют собой строку JSON, и когда она сохраняется в файле, она использует до 10 МБ диска. Однако, когда файл сжат (.zip), он использует только несколько КБ. Мы обеспокоены хранением таких данных в Кафке, поэтому пытаемся сжать, прежде чем писать на тему Кафки.

Когда измеряется длина двоичного кодированного сообщения (т.е. длина массива байтов), оно пропорционально длине строки данных. Поэтому я предполагаю, что двоичное кодирование не уменьшает размер.

Может ли кто-нибудь сказать мне, если двоичное кодирование сжимает данные? Если нет, как я могу применить сжатие?

Спасибо!

Ответ 1

Если двоичное кодирование сжимает данные?

Да и нет, это зависит от ваших данных.

В соответствии с двоичная кодировка avro, да, поскольку она хранит схему только один раз для каждого файла .avro, независимо от того, сколько данных в этом файле, следовательно, сохраняйте некоторое пространство без хранения имени ключа JSON много раз. И сериализация avro делает небольшое сжатие с сохранением int и длительным использованием переменной длины zig-zag (только для малых). В остальном avro не "сжимает" данные.

Нет, поскольку в некоторых экстремальных случаях данные, передаваемые по авросе, могут быть больше, чем исходные данные. Например. один .avro файл с одним Record, в котором только одно поле строки. Накладные расходы схемы могут победить сохранение, не нужно хранить имя ключа.

Если нет, как я могу применить сжатие?

Согласно avro codecs, avro имеет встроенный кодек сжатия и дополнительные. Просто добавьте одну строку при создании файлов контейнера объектов:

DataFileWriter.setCodec(CodecFactory.deflateCodec(6)); // using deflate

или

DataFileWriter.setCodec(CodecFactory.snappyCodec()); // using snappy codec

Чтобы использовать snappy, вам нужно включить библиотеку snappy-java в свои зависимости.

Ответ 2

Если вы планируете хранить свои данные на Kafka, подумайте об использовании поддержки сжатия Kafka:

ProducerConfig.set("compression.codec","snappy")

Сжатие полностью прозрачно с потребительской стороны, все расходуемые сообщения автоматически несжаты.