卡夫卡消费者名单

Posted

技术标签:

【中文标题】卡夫卡消费者名单【英文标题】:Kafka consumer list 【发布时间】:2015-12-18 07:36:43 【问题描述】:

我需要找到一种方法来向 Kafka 索要主题列表。我知道我可以使用包含在bin\ 目录中的kafka-topics.sh 脚本来做到这一点。一旦我有了这个列表,我就需要每个主题的所有消费者。我在该目录中找不到脚本,在 kafka-consumer-api 库中也找不到允许我执行此操作的类。

这背后的原因是我需要弄清楚主题的偏移量和消费者的偏移量之间的差异。

有没有办法做到这一点?还是我需要在我的每个消费者中实现此功能?

【问题讨论】:

请考虑更改已接受的答案,因为情况已发生变化,并且较新版本的 Kafka 中未使用 zookeeper。 【参考方案1】:

我没有看到这里提到它,而是我经常使用的一个命令,它可以帮助我鸟瞰所有组、主题、分区、偏移量、滞后、消费者等

kafka-consumer-groups.bat --bootstrap-server localhost:9092 --describe --all-groups

示例如下所示:

GROUP TOPIC PARTITION  CURRENT-OFFSET  LOG-END-OFFSET  LAG CONSUMER-ID HOST CLIENT-ID
Group Topic 2          7               7               0   <SOME-ID>   XXXX <SOME-ID>
:
:

最重要的列是LAG,对于健康平台,理想情况下应该是0(或更接近为 0 或低数字以实现高吞吐量) - 始终。所以一定要监控!!! ;-)。

附注: 可以在here 找到一篇关于如何监控延迟的有趣文章。

【讨论】:

【参考方案2】:

您也可以为此使用kafkactl:

# get all consumer groups (output as yaml)
kafkactl get consumer-groups -o yaml

# get only consumer groups assigned to a single topic (output as table)
kafkactl get consumer-groups --topic topic-a

示例输出(例如,作为 yaml):

name: my-group
protocoltype: consumer
topics:
 - topic-a
 - topic-b
 - topic-c

免责声明:我是这个项目的贡献者

【讨论】:

【参考方案3】:

每个主题的所有消费者

(将 --zookeeper 替换为 --bootstrap-server 以获取新 Kafka 客户端存储的组)

topictabconsumer 的表格形式获取所有消费者每个主题:

for t in `kafka-consumer-groups.sh --zookeeper <HOST>:2181 --list 2>/dev/null`; do
    echo $t | xargs -I  sh -c "kafka-consumer-groups.sh --zookeeper <HOST>:2181 --describe --group  2>/dev/null | grep ^ | awk 'print \$2\"\t\"\$1' "
done > topic-consumer.txt

使这对独一无二:

cat topic-consumer.txt | sort -u > topic-consumer-u.txt

得到想要的:

less topic-consumer-u.txt | grep -i <TOPIC>

【讨论】:

我认为这是最接近所提问题的解决方案。这应该是公认的答案。有时您不了解消费者群体,这就是您需要这个的原因。该解决方案的唯一警告是它不会过滤掉没有活跃消费者的消费者组中的主题。谢谢!【参考方案4】:

我意识到这个问题现在已经有将近 4 年的历史了。从那时起,卡夫卡发生了很大变化。上面提到了这一点,但只是小字,所以我写这篇文章是为了那些像我一样迟到了这个问题的用户。

    默认情况下,偏移量现在存储在 Kafka 主题中(不再存储在 Zookeeper 中),请参阅Offsets stored in Zookeeper or Kafka? 有一个 kafka-consumer-groups 实用程序,它返回所有信息,包括主题和分区的偏移量、消费者的偏移量,甚至是滞后(备注:当您询问主题的偏移量时,我假设您的意思是主题分区的偏移量)。在我的 Kafka 2.0 测试集群中:
kafka-consumer-groups --bootstrap-server kafka:9092 --describe
    --group console-consumer-69763 Consumer group 'console-consumer-69763' has no active members.

TOPIC           PARTITION  CURRENT-OFFSET  LOG-END-OFFSET  LAG             CONSUMER-ID     HOST            CLIENT-ID
pytest          0          5               6               1               -               -               -
``


【讨论】:

【参考方案5】:

高级消费者注册到 Zookeeper,因此您可以从 ZK 获取列表,类似于 kafka-topics.sh 获取主题列表的方式。我认为没有办法收集所有消费者;任何发送一些消费请求的应用程序实际上都是一个“消费者”,你无法判断它们是否已经完成。

在消费者方面,有一个JMX metric exposed to monitor the lag。此外,还有Burrow 用于延迟监控。

【讨论】:

【参考方案6】:

您可以将其用于 0.9.0.0。卡夫卡版

./kafka-consumer-groups.sh --list --zookeeper hostname:potnumber

查看您创建的组。这将显示所有消费者组名称。

 ./kafka-consumer-groups.sh --describe --zookeeper hostname:potnumber  --describe  --group consumer_group_name

查看详情

GROUP, TOPIC, PARTITION, CURRENT OFFSET, LOG END OFFSET, LAG, OWNER

【讨论】:

【参考方案7】:

使用 kafka-consumer-groups.sh

例如

bin/kafka-consumer-groups.sh  --list --bootstrap-server localhost:9092

bin/kafka-consumer-groups.sh --describe --group mygroup --bootstrap-server localhost:9092

【讨论】:

我们应该使用 --zookeeper 而不是 --bootstrap-server 但是 0.9.0.0 不是 kafka 的古老版本 :) bin/kafka-consumer-groups.sh --list --zookeeper localhost:2181 注意:这只会显示有关使用 ZooKeeper 的消费者的信息(而不是使用 Java 消费者 API 的消费者)。 bin/kafka-consumer-groups.sh --list --bootstrap-server localhost:9092 注意:这只会显示有关使用 Java 消费者 API 的消费者(非基于 ZooKeeper 的消费者)的信息。 Consumer group list 命令列出集群中的所有消费者组,但是有没有办法显示特定主题的消费者组? @user3366706 kafka-consumer-groups --topic 仅在提供 --reset-offsets 时适用,因此必须有一个不同的标志才能为“特定主题的组”创建 API 调用【参考方案8】:

Kafka 将所有信息存储在 zookeeper 中。您可以在 brokers->topics 下查看所有与主题相关的信息。如果您希望以编程方式获取所有主题,您可以使用 Zookeeper API 来实现。

在下面的链接中有详细说明 Tutorialspoint, Zookeeper Programmer guide

【讨论】:

这在 Kafka 的较新版本中实际上是不正确的。 Zookeeper 不再用于存储偏移量。偏移量存储在 Kafka 本身的特殊命名主题中 同意巴桑特。但无论如何,为 *** 提供答案应该包含足够的与问题相关且有用的信息,以提供最低价值。

以上是关于卡夫卡消费者名单的主要内容,如果未能解决你的问题,请参考以下文章

如何暂停卡夫卡消费者?

卡夫卡消费者不阅读消息

卡夫卡消费者不返回任何事件

卡夫卡消费者不是从最新消息开始

卡夫卡消费者:受控阅读主题

消费者。如何指定要读取的分区? [卡夫卡]