web-dev-qa-db-ja.com

Java、Apache kafkaのトピック内のメッセージ数を取得する方法

メッセージングにApache kafkaを使用しています。 Javaでプロデューサーとコンシューマーを実装しました。トピック内のメッセージ数を取得するにはどうすればよいですか?

61
Chetan

消費者の観点からこのことについて頭に浮かぶ唯一の方法は、実際にメッセージを消費し、それらを数えることです。

Kafkaブローカーは、起動以降に受信したメッセージの数のJMXカウンターを公開しますが、すでにパージされたメッセージの数を知ることはできません。

最も一般的なシナリオでは、Kafkaのメッセージは無限ストリームとして最もよく見られ、現在ディスク上に保持されているメッセージの数の離散値を取得することは関係ありません。さらに、すべてがトピック内のメッセージのサブセットを持っているブローカーのクラスターを扱う場合、事態はより複雑になります。

22
Lundahl

Javaではありませんが、役に立つかもしれません

./bin/kafka-run-class.sh kafka.tools.GetOffsetShell 
  --broker-list <broker>:  <port> 
  --topic <topic-name> --time -1 --offsets 1 
  | awk -F  ":" '{sum += $3} END {print sum}'
70
ssemichev

実際にこれを使用して、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の使用を開始できます。

14
Rudy

https://prestodb.io/docs/current/connector/kafka-tutorial.html を使用します

Facebookが提供する、いくつかのデータソース(Cassandra、Kafka、JMX、Redisなど)に接続するスーパーSQLエンジン。

PrestoDBは、オプションのワーカーを備えたサーバーとして実行され(余分なワーカーを持たないスタンドアロンモードがあります)、小さな実行可能JAR(presto CLIと呼ばれる)を使用してクエリを作成します。

Prestoサーバーを適切に構成したら、従来のSQLを使用できます。

SELECT count(*) FROM TOPIC_NAME;
11
Thomas Decaux

カスタムパーティショナーをテストする場合など、各パーティション内のメッセージ数を知りたい場合があります。次の手順は、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

これにより、3つのパーティションのメッセージ数を示すサンプル出力が出力されます。

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

行の数は、トピックのパーティションの数に応じて多少なります。

7
pdp

トピックのすべてのパーティションで未処理のメッセージを取得するApache Kafkaコマンド:

kafka-run-class kafka.tools.ConsumerOffsetChecker 
    --topic test --zookeeper localhost:2181 
    --group test_group

プリント:

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

列6は未処理のメッセージです。次のようにそれらを追加します。

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}'

awkは行を読み取り、ヘッダー行をスキップして6番目の列を加算し、最後に合計を出力します。

プリント

5
5
Eric Leschinski

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
5
ruslangm

トピックに保存されているすべてのメッセージを取得するには、各パーティションのストリームの最初と最後までコンシューマーを検索し、結果を合計します

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());
4
AutomatedMike

以下を実行します(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"
3
Borislav Markov

Kafka Managerの最新バージョンには、Summed Recent Offsetsというタイトルの列があります。

enter image description here

3
f01

Java 2.11-1.0.0のKafkaクライアントを使用すると、次のことができます。

    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
1

私が見つけた最も簡単な方法は、Kafdrop REST AP​​I /topic/topicNameを使用し、キーを指定することです:"Accept"/value:"application/json"ヘッダーを取得するJSONレスポンス。

これはここに記載されています

0

サーバーのJMXインターフェイスにアクセスできる場合、開始および終了オフセットは次の場所にあります。

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

TOPICNAMEPARTITIONNUMBERを置き換える必要があります)。特定のパーティションの各レプリカを確認する必要があること、またはgivenパーティション(これは時間の経過とともに変化する可能性があります)。

または、 Kafka Consumer メソッドbeginningOffsetsおよびendOffsetsを使用できます。

0

Kafka docsからの抜粋

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
0
S R Bandi

this 自分では試していませんが、理にかなっているようです。

kafka.tools.ConsumerOffsetCheckersource )も使用できます。

0
hba