0


【kafka专栏】消费者组数据积压的查看与处理方法

文章目录

在本专栏前面的文章已经为大家介绍过"消费者"与“消费者”组,在这里有必要回顾一下,并进行更深入的理解。

  • 消费者组是一组具有共同消费特征的消费者的集合,对于kafka来说,这个特征就是这些消费者共同消费一个或几个主题。
  • 消费者组存在的一个重要原因是:单个消费者无法满足某个主题下的数据处理的速度,所以需要多个消费者来负载

每一个消费者组内的消费者都具备一个共享id,即group id(消费者组id)。在创建消费者的时候,设置group id。默认创建消费者的group id是在

KAFKA_HOME/conf/consumer.properties

文件中定义的,默认值是test-consumer-group。

一、主题分区与消费者的数量

在开始为大家介绍消费者之前,有必要深入的了解一下“主题分区数量”与“消费者数量”之间的关系。kafka主题分区消费的一个原则是:一个分区只能被消费者组里面的一个消费者消费

1.1.当分区数量多于消费者的数量

当某个主题的分区数量,大于订阅它的消费者组内消费者数量,就会出现下面的情况。
在这里插入图片描述

  • 一个消费者消费多个分区
  • 分区尽量均衡的分给消费者组内的多个消费者

1.2.当分区数量小于消费者数量

当某个主题的分区数量,小于订阅它的消费者组内消费者数量,比如下图中,四个分区五个消费者,就会有一个消费者处于空闲状态。
在这里插入图片描述

所以kafka消费者组内的消费者不是越多越好,也不是消费者越多处理速度越快。如果分区数没有匹配消费者数量,创建再多的消费者也不会提高数据消费速率。

1.3.当分区数量等于消费者的数量

基于上面的内容,以及一个分区只能被消费者组里面的一个消费者消费的原则,最佳状态如下图所示:
在这里插入图片描述

所以当我们发现某一个主题的消费数据积压的时候,首先想到的应该是优化消费者数据消费的程序,提高数据处理效率。如果仍然无法满足需求,则同步的加大主题的分区数量以及消费者组内消费者的数量,让二者保持数量一致

1.4.多个消费者组-多主题

下面再用一张更复杂一点的图帮助大家理解,“主题分区数量”与“消费者数量”之间的关系。
在这里插入图片描述

  • 一个分区只能被消费者组里面的一个消费者消费
  • 一个消费者可能会消费某个主题内的多个分区
  • 最佳状态时主题分区数等于消费者组内消费者数量
  • 如果某消费者组消费者数量大于其订阅的主题的分区数,会发生多出来的消费者空转的现象。

二、查看消费者组的数据积压

在为大家讲解如何查看“消费者组的数据积压”之前,先纠正部分朋友的一个错误概念:积压不是在kafka主题分区内产生的么?为什么要查看消费者组的数据积压?。笔者愚笨,这个问题是我在刚开始学习kafka的时候没想通的一个问题。

  • 一个主题可以被多个消费者组订阅,比如消费者组A、消费者组B
  • 消费者组A的消费进度和消费者组B的消费进度一定不一样
  • 如果消费者组B的消费进度慢,就是消费者组B的消息数据发生积压。与消费者组A无关。

所以查看数据消费进度,或者消息数据是否积压,是以“消费者”组为单位进行查看的。可以通过命令行查看某个消费者组的消费进度情况

> bin/kafka-consumer-groups.sh --bootstrap-server zimug1:9092 --describe --group my-group

得到类似于下面的这样的响应结果:
在这里插入图片描述

由上文结果我们可以得到如下信息

  • 一个主题的一个分区信息占一行
  • 该消费者组订阅了三个主题:topic1(一个分区0)、topic2(两个分区0、1)、topic3(三个分区0、1、2)
  • CURRENT-OFFSET是当前数据消费进度的偏移
  • LOG-END-OFFSET是当前分区已经接收到的数据信息偏移
  • LAG = (LOG-END-OFFSET - CURRENT-OFFSET)。LAG的值越大说明数据积压越严重。

三、数据积压如何处理?

问:什么是数据积压?
答:我看过有的文章说LAG>0是数据积压,可能笔者对这个问题的理解不同。举个例子:如果某分区一天平均1000万数据,积压量稳定在1万条,这算是数据积压么?我觉得可以算也可以不算,这取决于你的用户对于数据延时的需求是什么样的?如果你平时LAG就是1万,从用户感知的角度也没有提出降低数据延时的需求,那么这就不是数据积压。如果你平时的LAG是1万,异常状态下变成了几十万,那么这就是数据积压了。

如果发生数据积压,从以下几个方面入手

  • 优化数据处理程序,提高数据处理的速度
  • 增大发生积压的主题的分区的数量
  • 同时增大消费该主题的消费者的数量,让其等于该主题的分区数
  • 前面三点都是基于kafka去处理,或者我们可以抛开kafka,在用户请求产生数据的时候给予一定的流量控制,比如:微服务可以使用Spring Cloud alibaba sentinal

如何增大主题分区数量?

> bin/kafka-topics.sh --alter \
--bootstrap-server broker1:9092,broker2:9092,broker3:9092 \
--topic my_topic_name 
--partitions 4

比如原来my_topic_name 主题分区数2个,我想增大为4个,可以使用上面的命令。注意:主题的分区数只能增大,不能减小,所以请谨慎评估,合理扩容。

标签: kafka java 大数据

本文转载自: https://blog.csdn.net/hanxiaotongtong/article/details/125588498
版权归原作者 字母哥哥 所有, 如有侵权,请联系我们删除。

“【kafka专栏】消费者组数据积压的查看与处理方法”的评论:

还没有评论