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 的二进制编码是不是压缩数据?的主要内容,如果未能解决你的问题,请参考以下文章

avro序列化详细操作

:编码与演化

:编码与演化

:编码与演化

求:C语言的游程编码,要求将大量的二进制的数据压缩

Debezium 将 Avro 数据视为二进制