计算存储在kafka主题

时间:2017-01-22 15:23:48

标签: apache-kafka kafka-consumer-api jms-topic

我使用的是0.9.0.0版本的Kafka,我想在不使用管理脚本kafka-console-consumer.sh的情况下计算主题中的消息数。

我已经尝试了答案Java, How to get number of messages in a topic in apache kafka中的所有命令 但没有人产生结果。 任何人都可以帮助我吗?

7 个答案:

答案 0 :(得分:54)

您可以尝试执行以下命令:

bin/kafka-run-class.sh kafka.tools.GetOffsetShell --broker-list localhost:9092,localhost:9093,localhost:9094 --topic test-topic --time -1

然后,总结每个分区的所有计数。

答案 1 :(得分:5)

您可以使用以下内容来总结所有计数:

.../bin/kafka-run-class kafka.tools.GetOffsetShell --broker-list <<broker_1>>:9092,<<broker_2:9092>>... --topic <<your_topic_name>> --time -1 | while IFS=: read topic_name partition_id number; do echo "$number"; done | paste -sd+ - | bc

答案 2 :(得分:5)

从技术上讲,您可以简单地使用主题中的所有消息并计算它们:

示例:

kafka-run-class.sh kafka.tools.SimpleConsumerShell --broker-list localhost:9092 --topic XYZ --partition 0*

kafka.tools.GetOffsetShell方法会为您提供偏移量,而不是主题中的实际消息数。这意味着如果主题被压缩,如果您通过消费或通过读取偏移来计算消息,则会得到两个不同的数字。

主题压缩:https://kafka.apache.org/documentation.html#design_compactionbasics

答案 3 :(得分:1)

如果您不想陷入“原始” Kafka脚本的麻烦之中,那么还有kafkacat

基本思想是

  • 使用每个分区的最后一条消息,
  • 相加偏移量(校正从零开始的偏移量)。

让我们开发这个。

kafkacat -C -b <broker> -t <topic> -o -1 -f '%p\t%o\n'

这将输出如下内容(加上stderr上的“分区到达终点”通知):

0    77
1    75
2    78

现在,kafkacat不会终止,但会一直在等待新消息。我们可以通过添加超时来避免这种情况(选择一​​个足够大的值,以便在给定的环境中获得所有分区):

timeout --preserve-status 1 kafkacat <snip>

现在我们可以继续添加第二列(每列+1)-但是,如果在该超时间隔内有新消息,我们可能会得到类似 this 的信息:

0    77
1    75
2    78
1    76

因此,我们必须考虑到这一点,只需做一点awk就可以了:

timeout --preserve-status 1 kafkacat <snip> 2> /dev/null \
| awk '{lastOffsets[$1] = $2} END {count = 0; for (i in lastOffsets) { count += lastOffsets[i] + 1 }; print count}'

请注意,我们如何使用(哈希)映射来记住每个分区的最后一次看到的偏移量,直到超时触发,然后在数组上循环以计算总和。

答案 4 :(得分:0)

您还可以使用awk和一个简单的循环来完成此操作

true (me)   = text.style.position = "absolute";
false (you) = text.style.positon = "absolute";

答案 5 :(得分:0)

获取主题中的记录数

brokers="<broker1:port>"
topic=<topic-name>
sum_1=$(/usr/hdp/current/kafka-broker/bin/kafka-run-class.sh kafka.tools.GetOffsetShell --broker-list $brokers --topic $topic --time -1 | grep -e ':[[:digit:]]*:' | awk -F  ":" '{sum += $3} END {print sum}')
sum_2=$(/usr/hdp/current/kafka-broker/bin/kafka-run-class.sh kafka.tools.GetOffsetShell --broker-list $brokers --topic $topic --time -2 | grep -e ':[[:digit:]]*:' | awk -F  ":" '{sum += $3} END {print sum}')
echo "Number of records in topic ${topic}: "$((sum_1 - sum_2))

答案 6 :(得分:0)

我们可以使用 kafkacat 命令来统计一个主题中的消息数量。命令如下。请注意,即使您的消息是多行的,此命令也将起作用。

kafkacat -b <broker_1_ip:port>,<broker_2_ip:port> -t <topic-name> -C -e -q -f 'Offset: %o\n' | wc -l

从控制台上打印的数字中减去 1,就是答案。