AVRO 的二进制编码是不是压缩数据?
Posted
技术标签:
【中文标题】AVRO 的二进制编码是不是压缩数据?【英文标题】:Does binary encoding of AVRO compress data?AVRO 的二进制编码是否压缩数据? 【发布时间】:2014-12-29 22:23:33 【问题描述】:在我们的一个项目中,我们使用 Kafka 和 AVRO 来跨应用程序传输数据。数据被添加到 AVRO 对象,对象被二进制编码以写入 Kafka。我们使用二进制编码,因为它通常被认为是与其他格式相比的最小表示。
数据通常是 JSON 字符串,当它保存在文件中时,它最多使用 10 Mb 的磁盘。但是,当文件被压缩 (.zip) 时,它只使用几个 KB。我们关心将此类数据存储在 Kafka 中,因此在写入 Kafka 主题之前尝试进行压缩。
当测量二进制编码消息的长度(即字节数组的长度)时,它与数据字符串的长度成正比。所以我假设二进制编码不会减少任何大小。
谁能告诉我二进制编码是否压缩数据?如果没有,我该如何应用压缩?
谢谢!
【问题讨论】:
【参考方案1】:如果二进制编码压缩数据?
是与否,这取决于您的数据。
根据avro binary encoding,是,因为它只为每个.avro
文件存储一次架构,无论该文件中有多少数据,因此节省了一些空间而不存储 JSON 的键名多次。 avro 序列化通过存储 int 和 long 利用 variable-length zig-zag 编码进行位压缩(仅适用于 small 值)。其余的,avro 不要“压缩”数据。
否,因为在某些极端情况下,avro 序列化数据可能比原始数据大。例如。一个.avro
文件和一个Record
,其中只有一个字符串字段。架构开销可能会破坏不需要存储密钥名称的保存。
如果没有,我该如何应用压缩?
根据avro codecs,avro 有内置的压缩编解码器和可选的。编写对象容器文件时只需添加一行:
DataFileWriter.setCodec(CodecFactory.deflateCodec(6)); // using deflate
或
DataFileWriter.setCodec(CodecFactory.snappyCodec()); // using snappy codec
要使用snappy
,您需要将snappy-java
库包含到您的依赖项中。
【讨论】:
【参考方案2】:如果您计划将数据存储在 Kafka 上,请考虑使用 Kafka 生产者压缩支持:
ProducerConfig.set("compression.codec","snappy")
压缩对消费者来说是完全透明的,所有消费的消息都会自动解压缩。
【讨论】:
如果您使用的是 Kafka,只需将您的代理设置为始终压缩数据。这将处理静止压缩。以上是关于AVRO 的二进制编码是不是压缩数据?的主要内容,如果未能解决你的问题,请参考以下文章