首页 > 编程语言 >Kafka - 生产者 - 压缩算法

Kafka - 生产者 - 压缩算法

时间:2023-08-31 14:44:18浏览次数:40  
标签:Producer 生产者 压缩 Broker Kafka 消息 版本 压缩算法

总结

1.Producer 端压缩、Broker 端保持、Consumer 端解压缩。

2.开启压缩的最佳实践:

  • Producer 端完成的压缩,那么启用压缩的一个条件就是 Producer 程序运行机器上的 CPU 资源要很充足。
  • 如果你的环境中带宽资源有限,那么我也建议你开启压缩。如果你的机器 CPU 资源有很多富余,强烈建议你开启 zstd 压缩,这样能极大地节省网络资源消耗。

 

kafka数据格式

Kafka 的消息层次都分为两层:消息集合(message set)以及消息(message)。一个消息集合(message set)中包含若干条日志项(record item),而日志项才是真正封装消息的地方。Kafka 底层的消息日志由一系列消息集合日志项组成。Kafka 通常不会直接操作具体的一条条消息,它总是在消息集合这个层面上进行写入操作。

 

目前 Kafka 共有两大类消息格式,社区分别称之为 V1 版本和 V2 版本。V2 版本是 Kafka 0.11.0.0 中正式引入的。V2 版本主要是针对 V1 版本的一些弊端做了修正:

1.把消息的公共部分抽取出来放到外层消息集合里面,这样就不用每条消息都保存这些信息了。我来举个例子。原来在 V1 版本中,每条消息都需要执行 CRC 校验,但有些情况下消息的 CRC 值是会发生变化的。比如在 Broker 端可能会对消息时间戳字段进行更新,那么重新计算之后的 CRC 值也会相应更新;再比如 Broker 端在执行消息格式转换时(主要是为了兼容老版本客户端程序),也会带来 CRC 值的变化。鉴于这些情况,再对每条消息都执行 CRC 校验就有点没必要了,不仅浪费空间还耽误 CPU 时间,因此在 V2 版本中,消息的 CRC 校验工作就被移到了消息集合这一层。

2.V2 版本还有一个和压缩息息相关的改进,就是保存压缩消息的方法发生了变化。之前 V1 版本中保存压缩消息的方法是把多条消息进行压缩然后保存到外层消息的消息体字段中;而 V2 版本的做法是对整个消息集合进行压缩。显然后者应该比前者有更好的压缩效果。我对两个版本分别做了一个简单的测试,结果显示,在相同条件下,不论是否启用压缩,V2 版本都比 V1 版本节省磁盘空间。当启用压缩时,这种节省空间的效果更加明显,就像下面这两张图展示的那样:

 

何时压缩?

在 Kafka 中,压缩可能发生在两个地方:生产者端和 Broker 端。

压缩一般发生在生产者端

生产者程序中配置 compression.type 参数即表示启用指定类型的压缩算法。比如下面这段程序代码展示了如何构建一个开启 GZIP 的 Producer 对象:

这里比较关键的代码行是 props.put(“compression.type”, “gzip”),它表明该 Producer 的压缩算法使用的是 GZIP。这样 Producer 启动后生产的每个消息集合都是经 GZIP 压缩过的,故而能很好地节省网络传输带宽以及 Kafka Broker 端的磁盘占用。

 Properties props = new Properties();
 props.put("bootstrap.servers", "localhost:9092");
 props.put("acks", "all");
 props.put("key.serializer", "org.apache.kafka.common.serialization.StringSerializer");
 props.put("value.serializer", "org.apache.kafka.common.serialization.StringSerializer");
 // 开启GZIP压缩
 props.put("compression.type", "gzip");
 
 Producer<String, String> producer = new KafkaProducer<>(props);

 

压缩何时会发生在broker端?

情况一:Broker 端指定了和 Producer 端不同的压缩算法

Producer 说:“我要使用 GZIP 进行压缩。”Broker 说:“不好意思,我这边接收的消息必须使用 Snappy 算法进行压缩。”你看,这种情况下 Broker 接收到 GZIP 压缩消息后,只能解压缩然后使用 Snappy 重新压缩一遍。

 

Broker 端也有一个参数叫 compression.type,和上面那个例子中的同名。但是这个参数的默认值是 producer,这表示 Broker 端会“尊重”Producer 端使用的压缩算法。可一旦你在 Broker 端设置了不同的 compression.type 值,就一定要小心了,因为可能会发生预料之外的压缩 / 解压缩操作,通常表现为 Broker 端 CPU 使用率飙升。

情况二:Broker 端发生了消息格式转换

为了兼容老版本的消费者程序。还记得之前说过的 V1、V2 版本吧?在一个生产环境中,Kafka 集群中同时保存多种版本的消息格式非常常见。为了兼容老版本的格式,Broker 端会对新版本消息执行向老版本格式的转换。这个过程中会涉及消息的解压缩和重新压缩。一般情况下这种消息格式转换对性能是有很大影响的。

 

除了这里的压缩之外,它还让 Kafka 丧失了引以为豪的 Zero Copy 特性。

 

何时解压缩?

最佳实践 —— Producer 端压缩、Broker 端保持、Consumer 端解压缩。

 

各种压缩算法对比

看一个压缩算法的优劣,有两个重要的指标:

一个指标是压缩比,原先占 100 份空间的东西经压缩之后变成了占 20 份空间,那么压缩比就是 5,显然压缩比越高越好;

另一个指标就是压缩 / 解压缩吞吐量,比如每秒能压缩或解压缩多少 MB 的数据。同样地,吞吐量也是越高越好。

 

对于 Kafka 而言,它们的性能测试结果出奇得一致,即:

  • 吞吐量方面:LZ4 > Snappy > zstd 和 GZIP
  • 压缩比方面,zstd > LZ4 > GZIP > Snappy

 

开启压缩的最佳实践

开启压缩的最佳实践:

  • Producer 端完成的压缩,那么启用压缩的一个条件就是 Producer 程序运行机器上的 CPU 资源要很充足。
  • 如果你的环境中带宽资源有限,那么我也建议你开启压缩。如果你的机器 CPU 资源有很多富余,强烈建议你开启 zstd 压缩,这样能极大地节省网络资源消耗。

 

标签:Producer,生产者,压缩,Broker,Kafka,消息,版本,压缩算法
From: https://www.cnblogs.com/frankcui/p/17669515.html

相关文章

  • Kafka-基础
    1.简介Kafka(ApacheKafka)是一种分布式流数据平台,最初由LinkedIn开发,并于后来捐赠给Apache软件基金会,成为了一个Apache顶级项目。它被设计用于处理大规模、实时的数据流,并为构建高吞吐量、容错性强的数据流应用程序提供支持。Kafka的特点使得它在日志收集、实时处理、事件驱动架......
  • kafka安装以及参数
    kafka安装安装JDKyuminstall-yjava-1.8.0-openjdk.x86_64查看版本java-versionkafka是分布式的,需要多台机器,并且保证机器之间是免密登录同时需要用zookeeper集群负责管理。1、kafka版本选择,从官网下载即可,我这使用的是kafka_2.12-2.70.tgz2、brokers节点分配,注......
  • Kafka - 线上集群部署方案怎么做?
    既然是集群,那必然就要有多个Kafka节点机器,因为只有单台机器构成的Kafka伪集群只能用于日常测试之用,根本无法满足实际的线上生产需求。而真正的线上环境需要仔细地考量各种因素,结合自身的业务需求而制定。下面我就分别从操作系统、磁盘、磁盘容量和带宽等方面来讨论一下。 ......
  • 生产环境 kafka 平滑迁移之旅
    背景线上kafka集群,3台机器,3个broker;其中某台机器因为硬件故障,需要停机维修;停机意味这跑在机器上的服务会停止。所以本次做kafka迁移的目标是机器可以停止但依赖kafka的上游和下游业务可不能停止,因为所属行业的特殊性,服务的停止,对业务的影响和伤害还蛮大的。分析我们知道kafka是有......
  • Kafka - 不仅是消息引擎,还是分布式流处理平台
     如果你通读全篇文字但只能记住一句话,我希望你记住的就是这句ApacheKafka是消息引擎系统,也是一个分布式流处理平台(DistributedStreamingPlatform) 作为流处理平台,Kafka与其他主流大数据流式计算框架相比,优势在哪里呢?我能想到的有两点。第一点是更容易实现端到端的正......
  • Kafka - 为什么 Kafka 不像 MySQL 那样允许追随者副本对外提供读服务?
    几个原因:1,kafka的分区已经让读是从多个broker读从而负载均衡,不是MySQL的主从,压力都在主上;2,kafka保存的数据和数据库的性质有实质的区别就是数据具有消费的概念,是流数据,kafka是消息队列,所以消费需要位移,而数据库是实体数据不存在这个概念,如果从kafka的follower读,消费端offset控制......
  • kafka的下载和了解
    可以登录Apachekafka官方下载https://kafka.apache.org/downloads.html下载Scala2.13 -kafka_2.13-3.3.1.tgz(asc,sha512)官方推荐下载scala2.13版本的。kafka作为一个分布式流平台,有哪些关键的能力?发布和订阅消息(流),在这方面,它类似于一个消息队列。以容错(故障转......
  • 读kafka生产端源码,窥kafka设计之道(下)
    背景在上一篇文章《读kafka生产端源码,窥kafka设计之道(上)》留下了kafka设计上比较优秀的一个点;内存的循环使用。本篇文章准备盘盘它。好奇为什么kafka减少发送消息时向JVM频繁申请内存,就可以降低JVMGC的执行次数?我们知道网络上传输的都是二进制数据;而在java中想通过socke网络套接......
  • SpringBoot整合kafka配置多个kafka配置
     SpringBoot整合kafka的简单应用及配置说明(包含账号密码配置)、Kerberos证书连接方式:https://www.cnblogs.com/pxblog/p/14821853.html 依赖<dependency><groupId>org.springframework.kafka</groupId><artifactId>spring-kafka</artifactI......
  • Java多线程-实现 生产者-消费者 模式
    多线程实现生产者消费者,堆积满100后停止生产,消费到小于50后继续生产这是一种写法,但是我觉得不太好:它通过循环创建了很多的线程,每个线程只消费/生产一次它使用notifyAll()通知所有的线程唤醒,包括生产者和消费者,感觉产品数量永远也达不到50publicclassProducerimpleme......