AVRO的二进制编码压缩数据吗?

时间:2014-11-03 09:28:10

标签: avro

在我们的一个项目中,我们使用Kafka和AVRO在应用程序之间传输数据。数据被添加到AVRO对象,对象被二进制编码以写入Kafka。我们使用二进制编码,因为与其他格式相比,它通常被称为最小表示。

数据通常是JSON字符串,当它保存在文件中时,它使用最多10 Mb的磁盘。但是,当文件被压缩(.zip)时,它只使用几个KB。我们担心在Kafka中存储这样的数据,因此在写入Kafka主题之前尝试压缩。

当测量二进制编码消息的长度(即字节数组的长度)时,它与数据串的长度成比例。所以我假设二进制编码没有减少任何大小。

有人能告诉我二进制编码是否会压缩数据?如果没有,我该如何应用压缩?

谢谢!

2 个答案:

答案 0 :(得分:18)

  

如果二进制编码压缩数据?

是和否,这取决于您的数据。

根据avro binary encoding因为它只为每个.avro文件存储一次架构,无论该文件中有多少数据,因此节省了一些空间多次存储JSON的密钥名称。并且avro序列化通过存储int和长期利用variable-length zig-zag编码(仅适用于值)进行一点压缩。其余的,avro don"压缩"数据

在某些极端情况下,avro序列化数据可能比原始数据更大。例如。一个.avro文件,其中一个Record,其中只有一个字符串字段。架构开销可以避免存储不需要存储密钥名称。

  

如果没有,我该如何应用压缩?

根据avro codecs,avro内置了压缩编解码器和可选编解码器。只需在编写对象容器文件时添加一行:

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

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

要使用snappy,您需要将snappy-java库包含在依赖项中。

答案 1 :(得分:3)

如果您打算将数据存储在Kafka上,请考虑使用Kafka生产者压缩支持:

{{1}}

压缩对消费者来说是完全透明的,所有消费的消息都会自动解压缩。