Java,如何在apache kafka中获取主题中的消息数量

时间:2015-02-18 09:25:06

标签: java messages apache-kafka

我正在使用apache kafka进行消息传递。我用Java实现了生产者和使用者。我们如何获得主题中的消息数量?

17 个答案:

答案 0 :(得分:69)

它不是java,但可能有用

Sheets("TestInput").Select
    With Range("A2:A60000")
        .FormatConditions.Delete
        .FormatConditions.Add Type:=xlExpression, Formula1:= _
        "=IF(A2<>"""",NOT(AND(LEN(A2)<51,SUMPRODUCT(LEN(A2)-LEN(SUBSTITUTE(LOWER(A2),Validations!$A$2:$A$41,"""")))=LEN(A2))))"
        With .FormatConditions(1).Font
            .Bold = True
            .Italic = False
            .TintAndShade = 0
        End With
        With .FormatConditions(1).Interior
            .PatternColorIndex = xlAutomatic
            .Color = 255
            .TintAndShade = 0
        End With
        .FormatConditions(1).StopIfTrue = False
    End With

答案 1 :(得分:19)

从消费者的角度来看,唯一可以想到的方法是实际使用消息并计算它们。

Kafka经纪人公开了自启动以来收到的消息数量的JMX计数器,但您不知道已经清除了多少消息。

在大多数常见情况下,Kafka中的消息最好被视为无限流,并且获取当前在磁盘上保留的数量的离散值是不相关的。此外,在处理一个经纪人群集时,事情变得更加复杂,这些经纪人都有一个主题中的消息子集。

答案 2 :(得分:14)

我实际上用它来对我的POC进行基准测试。您要使用ConsumerOffsetChecker的项目。您可以使用如下的bash脚本运行它。

bin/kafka-run-class.sh kafka.tools.ConsumerOffsetChecker  --topic test --zookeeper localhost:2181 --group testgroup

以下是结果: enter image description here 正如您在红色框中看到的,999是主题中当前消息的数量。

更新:ConsumerOffsetChecker自0.10.0开始不推荐使用,您可能希望开始使用ConsumerGroupCommand。

答案 3 :(得分:11)

使用https://prestodb.io/docs/current/connector/kafka-tutorial.html

由Facebook提供的超级SQL引擎,可连接多个数据源(Cassandra,Kafka,JMX,Redis ......)。

PrestoDB作为带有可选工作服务器的服务器运行(有一个没有额外工作者的独立模式),然后使用一个小的可执行JAR(称为presto CLI)进行查询。

一旦配置好Presto服务器,就可以使用传统的SQL:

SELECT count(*) FROM TOPIC_NAME;

答案 4 :(得分:7)

有时候兴趣在于知道每个分区中的消息数量,例如,在测试自定义分区程序时。后续步骤已经过测试,可以与Confluent 3.2中的Kafka 0.10.2.1-2一起使用。给出Kafka主题kt和以下命令行:

$ kafka-run-class kafka.tools.GetOffsetShell \
  --broker-list host01:9092,host02:9092,host02:9092 --topic kt

打印示例输出,显示三个分区中的消息计数:

kt:2:6138
kt:1:6123
kt:0:6137

根据主题的分区数量,行数可能更多或更少。

答案 5 :(得分:5)

由于不再支持ConsumerOffsetChecker,因此您可以使用此命令检查主题中的所有消息:

bin/kafka-run-class.sh kafka.admin.ConsumerGroupCommand \
    --group my-group \
    --bootstrap-server localhost:9092 \
    --describe

LAG是主题分区中邮件的数量:

enter image description here

您也可以尝试使用kafkacat。这是一个开源项目,可以帮助您从主题和分区中读取消息并将其打印到stdout。这是一个示例,该示例读取sample-kafka-topic主题中的最后10条消息,然后退出:

kafkacat -b localhost:9092 -t sample-kafka-topic -p 0 -o -10 -e

答案 6 :(得分:4)

Apache Kafka命令在主题的所有分区上获取未处理的消息:

Group      Topic        Pid Offset          logSize         Lag             Owner
test_group test         0   11051           11053           2               none
test_group test         1   10810           10812           2               none
test_group test         2   11027           11028           1               none

打印:

kafka-run-class kafka.tools.ConsumerOffsetChecker 
    --topic test --zookeeper localhost:2181 
    --group test_group 2>/dev/null | awk 'NR>1 {sum += $6} 
    END {print sum}'

第6列是未处理的消息。像这样添加它们:

5

awk读取行,跳过标题行并添加第6列,最后打印总和。

打印

Parallel.ForEach(results, (x) =>
    {
        foo();
    });

答案 7 :(得分:3)

要获取为该主题存储的所有消息,您可以在每个分区的流的开头和结尾寻找消费者并对结果求和

List<TopicPartition> partitions = consumer.partitionsFor(topic).stream()
        .map(p -> new TopicPartition(topic, p.partition()))
        .collect(Collectors.toList());
    consumer.assign(partitions); 
    consumer.seekToEnd(Collections.emptySet());
Map<TopicPartition, Long> endPartitions = partitions.stream()
        .collect(Collectors.toMap(Function.identity(), consumer::position));
    consumer.seekToBeginning(Collections.emptySet());
System.out.println(partitions.stream().mapToLong(p -> endPartitions.get(p) - consumer.position(p)).sum());

答案 8 :(得分:3)

在最新版本的Kafka Manager中,有一个标题为 Summed Recent Offsets 的专栏。

enter image description here

答案 9 :(得分:2)

我有同样的问题,这是我在科特林的一个KafkaConsumer上做的事情:

val messageCount = consumer.listTopics().entries.filter { it.key == topicName }
    .map {
        it.value.map { topicInfo -> TopicPartition(topicInfo.topic(), topicInfo.partition()) }
    }.map { consumer.endOffsets(it).values.sum() - consumer.beginningOffsets(it).values.sum()}
    .first()

非常粗糙的代码,因为我刚刚开始使用它,但是基本上您想从结束偏移中减去主题的开始偏移,这将是该主题的当前消息计数。

由于其他配置(清理策略,remaining-ms等)可能最终导致从主题中删除旧消息,因此您不能仅仅依靠结束偏移量。 偏移量仅“向前”移动,因此始端偏移量将向前移动到更接近结束偏移量的位置(如果主题现在没有消息,则最终移至相同的值)。

基本上,结束偏移量代表通过该主题的消息总数,而两者之间的差代表该主题当前包含的消息数。

答案 10 :(得分:2)

运行以下命令(假设kafka-console-consumer.sh在路径上):

kafka-console-consumer.sh  --from-beginning \
--bootstrap-server yourbroker:9092 --property print.key=true  \
--property print.value=false --property print.partition \
--topic yourtopic --timeout-ms 5000 | tail -n 10|grep "Processed a total of"

答案 11 :(得分:1)

使用Kafka 2.11-1.0.0的Java客户端,您可以执行以下操作:

    KafkaConsumer<String, String> consumer = new KafkaConsumer<>(props);
    consumer.subscribe(Collections.singletonList("test"));
    while(true) {
        ConsumerRecords<String, String> records = consumer.poll(100);
        for (ConsumerRecord<String, String> record : records) {
            System.out.printf("offset = %d, key = %s, value = %s%n", record.offset(), record.key(), record.value());

            // after each message, query the number of messages of the topic
            Set<TopicPartition> partitions = consumer.assignment();
            Map<TopicPartition, Long> offsets = consumer.endOffsets(partitions);
            for(TopicPartition partition : offsets.keySet()) {
                System.out.printf("partition %s is at %d\n", partition.topic(), offsets.get(partition));
            }
        }
    }

输出是这样的:

offset = 10, key = null, value = un
partition test is at 13
offset = 11, key = null, value = deux
partition test is at 13
offset = 12, key = null, value = trois
partition test is at 13

答案 12 :(得分:0)

Kafka文档摘录

0.9.0.0中的弃用

不推荐使用kafka-consumer-offset-checker.sh(kafka.tools.ConsumerOffsetChecker)。今后,请使用kafka-consumer-groups.sh(kafka.admin.ConsumerGroupCommand)来实现此功能。

我正在运行同时为服务器和客户端启用SSL的Kafka代理。下面的命令我使用

kafka-consumer-groups.sh --bootstrap-server Broker_IP:Port --list --command-config /tmp/ssl_config kafka-consumer-groups.sh --bootstrap-server Broker_IP:Port --command-config /tmp/ssl_config --describe --group group_name_x

/ tmp / ssl_config如下

security.protocol=SSL
ssl.truststore.location=truststore_file_path.jks
ssl.truststore.password=truststore_password
ssl.keystore.location=keystore_file_path.jks
ssl.keystore.password=keystore_password
ssl.key.password=key_password

答案 13 :(得分:0)

如果您有权访问服务器的JMX界面,则起始和结束偏移量位于:

kafka.log:type=Log,name=LogStartOffset,topic=TOPICNAME,partition=PARTITIONNUMBER
kafka.log:type=Log,name=LogEndOffset,topic=TOPICNAME,partition=PARTITIONNUMBER

(您需要替换TOPICNAMEPARTITIONNUMBER)。 请记住,您需要检查给定分区的每个副本,或者需要找出哪个代理是给定分区的领导者(并且该代理会随着时间而变化)。

或者,您可以使用Kafka Consumer方法beginningOffsetsendOffsets

答案 14 :(得分:0)

我发现的最简单的方法是使用Kafdrop REST API /topic/topicName并指定键:"Accept" /值:"application/json"标头,以获取JSON响应。

This is documented here

答案 15 :(得分:0)

您可以使用 kafkatool 。 请检查此链接-> http://www.kafkatool.com/download.html

  

Kafka工具是用于管理和使用Apache Kafka的GUI应用程序   集群。它提供了一个直观的UI,可让用户快速查看   Kafka群集中的对象以及存储在   集群的主题。

答案 16 :(得分:0)

我自己没有尝试this,但似乎有道理。

您还可以使用kafka.tools.ConsumerOffsetCheckersource)。