Kafka压缩

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Kafka压缩相关的知识,希望对你有一定的参考价值。

参考技术A 首先说明一点kafka的压缩和kafka的compact是不同的,compact就是相同的key只保留一条,是数据清理方式的一种和kafka的定期删除策略是并列的;而kafka的压缩是指数据不删除只是采用压缩算法进行压缩。
kafka从0.7版本就开始支持压缩功能:
1)kafka的发送端将消息按照批量(如果批量设置一条或者很小,可能有相反的效果)的方式进行压缩。
2)服务器端直接将压缩消息保存(特别注意,如果kafka的版本不同,那么就存在broker需要先解压缩再压缩的问题,导致消耗资源过多)。
3)消费端自动解压缩,测试了下,发送端无论采用什么压缩模式,消费端无论设置什么解压模式,都可以自动完成解压缩功能。
4)压缩消息可以和非压缩消息混存,也就是说如果你kafka里面先保存的是非压缩消息,后面改成压缩,不用担心,kafka消费端自动支持。

测试的kafka版本:kafka_2.12-1.1.1
测试的kafka客户端版本:0.10.2.1
测试数据的条数:20000
kafka支持三种压缩算法,lz4、snappy、gzip,

通过上面数据来看,gzip的压缩效果最好,但是生成耗时更长,snappy和lz4的数据差不多,更倾向于lz4,具huxi大神的书上所说kafka里面对snappy做了硬编码,所以性能上最好的是lz4,推荐使用此压缩算法。

压缩率对比:

性能对比图:

很简单:

消费端无论设置什么压缩模式,都可以正确的解压kafka的消息,也就是说消费端可以不设置解压缩,
不过可能性能有所下降。

kafka消息压缩官方说明翻译

kafka消息压缩官方说明

原文地址:https://cwiki.apache.org/confluence/display/KAFKA/Compression

Compression

该特性引入了 Kafka 中端到端的块压缩特性。 如果启用,数据将由生产者压缩,以压缩格式写入服务器并由消费者解压缩。 压缩会以一定的解压成本提高消费者吞吐量。 这在跨数据中心镜像数据时特别有用。

Design

一组消息可以被压缩并表示为一个压缩消息。 从这个意义上说,消息根据定义是递归的。 ByteBufferMessageSet 可以包含未压缩和压缩的数据。 因此,我们需要某种方式从未压缩的消息中识别压缩消息。 为了识别压缩消息,我们在消息头中引入了一个压缩属性字节。 在消息头中增加一个字节表示网络字节格式以及存储字节格式的变化。 这种消息头部格式化为 magic 字节值 1。

magic byte=1 的消息头格式,现在看起来像 -

1 byte magic1 byte compression-attributes4 byte CRC32 of the payload

属性字节中的最低 2 位将选择用于压缩数据的压缩编解码器。 压缩编解码器值为 0 表示未压缩消息。

Offset management on the consumer

消费者收到的主题数据可能包含压缩消息和未压缩消息。 消费者迭代器透明地解压压缩数据,只返回未压缩的消息。 消费者中的偏移量维护变得有点棘手。 在zookeeper消费者中,每次返回消息时都会更新消耗的偏移量。 这个消耗的偏移量应该是正确的故障恢复的有效获取偏移量。 由于数据以压缩格式存储在代理上,因此有效的提取偏移量是压缩消息边界。 因此,对于压缩数据,消耗的偏移量将一次增加一条压缩消息。 如果消费者失败,这会产生可能重复的副作用。 对于未压缩的数据,消耗的偏移量将一次增加一条消息。

Backwards compatibility

0.7 版本的代理和消费者将能够理解幻字节值 0 和 1 的消息。因此代理和消费者向后兼容。

Configuration changes

生产者方面有 2 个新的配置参数 -

配置参数备注默认值
compressed.topicscomma separated list of topics for which compression should be enabled. This doesn’t mean anything when compression.codec = 0empty
compression.codecControls the compression codec to be used by the producer. (0: No compression, 1: GZIP compression, 2: Snappy compression, 3: LZ4 compression)0
compression.topics=emptycompression.topics=“topicA,topicB”
compression.codec=0All topics are uncompressed since compression is disabledAll topics are uncompressed since compression is disabled
compression.codec=1All topics are compressedOnly the topics topicA and topicB are compressed

Compression codecs supported

目前,仅支持 GZIP、Snappy 和 LZ4 压缩编解码器。

以上是关于Kafka压缩的主要内容,如果未能解决你的问题,请参考以下文章

kafka消息压缩官方说明翻译

kafka高吞吐量之消息压缩

使用高级消费者和简单消费者的kafka压缩

获取 Kafka 压缩消息大小

浅谈架构:kafka高吞吐量之消息压缩

即使我在生产者配置中指定了压缩类型,kafka 代理也没有压缩我更大的消息