在我们的一个项目中,我们使用Kafka和AVRO在应用程序之间传输数据.数据被添加到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
库包含在依赖项中.