在我们的一个项目中,我们使用带有AVRO的Kafka在跨应用程序之间传输数据。数据被添加到AVRO对象,并且该对象被二进制编码以写入Kafka。我们使用二进制编码,因为与其他格式相比,二进制编码通常被认为是一种最小的表示形式。
数据通常是JSON字符串,当保存在文件中时,它会使用多达10 Mb的磁盘。但是,在压缩文件(.zip)时,它仅使用几个KB。我们担心将这些数据存储在Kafka中,因此尝试在写入Kafka主题之前进行压缩。
当测量二进制编码消息的长度(即字节数组的长度)时,它与数据字符串的长度成正比。因此,我假设二进制编码不会减小任何大小。
有人可以告诉我二进制编码是否压缩数据?如果没有,如何应用压缩?
谢谢!
二进制编码是否可以压缩数据?
是和否,这取决于您的数据。
根据avro二进制编码,是的,因为它只为每个.avro
文件存储一次架构,而不管该文件中有多少数据,因此节省了一些空间,而无需多次存储JSON的键名。而avro序列化则通过存储int并利用可变长度的 之字形编码(仅适用于较小的值)来进行位压缩。对于其余的内容,avro不会“压缩”数据。
不,在某些极端情况下,avro序列化数据可能会比原始数据大。例如。一个.avro
文件,其中一个Record
只有一个字符串字段。架构开销可能会破坏不需要存储键名的原因。
如果没有,如何应用压缩?
根据avro编解码器,avro具有内置的压缩编解码器和可选的压缩编解码器。编写对象容器文件时只需添加一行:
DataFileWriter.setCodec(CodecFactory.deflateCodec(6)); // using deflate
要么
DataFileWriter.setCodec(CodecFactory.snappyCodec()); // using snappy codec
要使用它,snappy
您需要将snappy-java
库包含到您的依赖项中。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句