2014-11-03 37 views
10

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

的数据通常是一个JSON字符串,当它被保存在一个文件,它使用到磁盘上的10 MB。但是,当文件被压缩(.zip)时,它只使用几个KB。我们关心的是将这些数据存储在Kafka中,所以在写入Kafka话题之前试图压缩。

当被测量的二进制编码消息(即字节数组的长度)的长度,它正比于数据串的长度。所以我认为二进制编码不会缩小任何尺寸。

有人可以告诉我,如果二进制编码压缩数据?如果不是,我该如何应用压缩?

谢谢!

回答

15

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

是,也不是,这取决于你的数据。

avro binary encoding它仅适用于每一个.avro文件存储架构一次,不管有多少DATAS在该文件中,从而节省一些空间W/O存储JSON的键名多次。并avro序列化做一点压缩与存储int和长期利用variable-lengthzig-zag编码(只为值)。其余的,avro不会“压缩”数据。

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

如果没有,我怎么能应用压缩?

根据avro codecs,avro有内置的压缩​​编解码器和可选的压缩编解码器。只需添加一条线,而写对象容器文件:

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

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

要使用snappy你需要包括snappy-java库到您的依赖。

1

如果您打算存储在卡夫卡的数据,可以考虑使用卡夫卡生产压缩支持:

ProducerConfig.set("compression.codec","snappy") 

压缩与消费端完全透明,所有消费的消息被自动解压缩。