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

25
在我们的一个项目中,我们使用Kafka和AVRO在应用程序之间传输数据。数据被添加到AVRO对象中,并将对象二进制编码以写入Kafka。我们使用二进制编码,因为它通常被认为是与其他格式相比最小的表示。
数据通常是JSON字符串,当保存在文件中时,占用高达10 MB的磁盘空间。但是,当文件被压缩(.zip)时,只使用几KB。我们担心存储这样的数据在Kafka中,所以尝试在写入Kafka主题之前进行压缩。
当测量二进制编码消息的长度(即字节数组的长度)时,它与数据字符串的长度成比例。因此,我认为二进制编码不会减少任何大小。
有人能告诉我二进制编码是否压缩数据吗?如果没有,我该如何应用压缩?
谢谢!
2个回答

34

二进制编码是否压缩数据?

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

根据avro二进制编码,仅当每个.avro文件仅存储一次模式时(不管该文件中有多少数据),才会发生,因此可以节省空间而不需要多次存储JSON的键名。同时,Avro序列化在存储int和long时利用可变长度 zig-zag编码进行了一些压缩(仅适用于值)。除此之外,Avro并没有“压缩”数据。

但在某些极端情况下,,因为Avro序列化后的数据可能比原始数据更大,例如一个Record中只有一个字符串字段的.avro文件,此时模式开销可能会抵消不需要存储键名称所带来的节省。

如果没有,我该如何应用压缩?
根据avro编解码器,avro具有内置的压缩编解码器和可选的编解码器。只需在写入对象容器文件时添加一行即可:
DataFileWriter.setCodec(CodecFactory.deflateCodec(6)); // 使用deflate 或者
DataFileWriter.setCodec(CodecFactory.snappyCodec()); // 使用snappy编解码器
要使用snappy,您需要将snappy-java库包含到您的依赖中。

7
如果您计划将数据存储在Kafka上,请考虑使用Kafka生产者的压缩支持:
ProducerConfig.set("compression.codec","snappy")

压缩对用户端完全透明,所有接收到的消息都会自动解压。


2
如果您正在使用Kafka,只需设置代理程序始终压缩数据即可。这将处理静态压缩。 - George Smith

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接