在我们的一个项目中,我们使用Kafka和AVRO在应用程序之间传输数据。数据被添加到AVRO对象,对象被二进制编码以写入Kafka。我们使用二进制编码,因为与其他格式相比,它通常被称为最小表示。
数据通常是JSON字符串,当它保存在文件中时,它使用最多10 Mb的磁盘。但是,当文件被压缩(.zip)时,它只使用几个KB。我们担心在Kafka中存储这样的数据,因此在写入Kafka主题之前尝试压缩。
当测量二进制编码消息的长度(即字节数组的长度)时,它与数据串的长度成比例。所以我假设二进制编码没有减少任何大小。
有人能告诉我二进制编码是否会压缩数据?如果没有,我该如何应用压缩?
谢谢!
答案 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}}
压缩对消费者来说是完全透明的,所有消费的消息都会自动解压缩。