我使用的是0.9.0.0版本的Kafka,我想在不使用管理脚本kafka-console-consumer.sh的情况下计算主题中的消息数。
我已经尝试了答案Java, How to get number of messages in a topic in apache kafka中的所有命令 但没有人产生结果。 任何人都可以帮助我吗?
答案 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,就是答案。