Kafka消息编解码器 - 压缩和解压缩

时间:2013-11-10 14:31:21

标签: compression apache-kafka

使用kafka时,我可以通过设置我的kafka生产者的kafka.compression.codec属性来设置编解码器。

假设我在我的制作人中使用snappy压缩,当使用某个kafka-consumer从kafka消费消息时,我应该做些什么来解密来自snappy的数据,还是kafka消费者的一些内置功能?

relevant documentation中,我找不到任何与kafka消费者编码有关的属性(它只与生产者有关)。

有人可以清除这个吗?

3 个答案:

答案 0 :(得分:10)

根据我的理解,去压缩由消费者自己照顾。正如他们在官方维基页面中提到的那样 The consumer iterator transparently decompresses compressed data and only returns an uncompressed message

this文章中所述,消费者的工作方式如下

  

消费者具有后台“fetcher”线程,它们连续从经纪人那里获取1MB的数据并将其添加到内部阻塞队列。使用者线程从此阻塞队列中取消数据,解压缩并迭代消息

并且在End-to-end Batch Compression下的文档页面中写了

  

可以将一批消息压缩在一起压缩并以此形式发送到服务器。这批消息将以压缩形式写入,并将在日志中保持压缩状态,并且只能由消费者解压缩。

所以看起来解压缩部分是在消费者自己处理的,你需要做的就是在创建生产者时使用compression.codec ProducerConfig属性提供有效/支持的压缩类型。我找不到任何示例或解释说明消费者端的任何减压方法。如果我错了,请纠正我。

答案 1 :(得分:0)

我在v0.8.1中遇到了同样的问题,除了说消费者应该“透明地”解压缩它从未做过的压缩数据之外,Kafka中的压缩解除记录很少。

Kafka网站中使用 ConsumerIterator 的示例高级客户客户端仅适用于未压缩的数据。在Producer客户端中启用压缩后,消息永远不会进入以下“while”循环。希望他们应该尽快解决这个问题,否则他们不应该声称这个功能,因为有些用户可能会使用Kafka来传输需要批处理和压缩功能的大型邮件。

ConsumerIterator <byte[], byte[]> it = stream.iterator();
while(it.hasNext())
{
   String message = new String(it.next().message());
}

答案 2 :(得分:0)

如果kafka生产者正在发送压缩流(GZIP或SNAPPY),我对卡夫卡消费者方面的减压有一点疑问。听起来像kafka消费者在消费者一侧透明地对压缩流进行了解压缩。请在这个天气下纠正我,我不确定在这里。

或者,如果我的上述理解是错误的,那么在卡夫卡消费者方面是否有任何解压缩的例子?