web-dev-qa-db-ja.com

kafkaトピックの最新のオフセットを取得するにはどうすればよいですか?

Javaを使用してkafkaコンシューマーを作成しています。メッセージのリアルタイムを保持したいので、1000以上など、消費を待機しているメッセージが多すぎる場合は、消費されていないメッセージを破棄し、最新のオフセットから消費を開始する必要があります。

この問題では、トピックの最後のコミット済みオフセットと最新のオフセット(1パーティションのみ)を比較しようとします。これら2つのオフセットの差が特定の量よりも大きい場合、トピックの最新のオフセットを次のように設定しますこれらの冗長なメッセージを破棄できるようにオフセットします。

今、私の問題はトピックの最新のオフセットを取得する方法です。古い消費者を使用できると言う人もいますが、それは複雑すぎます。新しい消費者はこの機能を持っていますか?

25
Neptune

新しい消費者も複雑です。

//assign the topic consumer.assign();

//seek to end of the topic consumer.seekToEnd();

//the position is the latest offset consumer.position();

23
lynn

Kafka version:0.10.1.1

// Get the diff of current position and latest offset
Set<TopicPartition> partitions = new HashSet<TopicPartition>();
TopicPartition actualTopicPartition = new TopicPartition(record.topic(), record.partition());
partitions.add(actualTopicPartition);
Long actualEndOffset = this.consumer.endOffsets(partitions).get(actualTopicPartition);
long actualPosition = consumer.position(actualTopicPartition);          
System.out.println(String.format("diff: %s   (actualEndOffset:%s; actualPosition=%s)", actualEndOffset -actualPosition ,actualEndOffset, actualPosition));  
10
hiaclibe

kafkaサーバーコマンドラインツールを使用することもできます。

./bin/kafka-run-class.sh kafka.tools.GetOffsetShell --broker-list localhost:9092 --topic topic-name

9
Steven
KafkaConsumer<String, String> consumer = ...
consumer.subscribe(Collections.singletonList(topic));
TopicPartition topicPartition = new TopicPartition(topic, partition);
consumer.poll(0);
consumer.seekToEnd(Collections.singletonList(topicPartition));
long currentOffset = consumer.position(topicPartition) -1;

上記のスニペットは、指定されたトピックとパーティション番号の現在のコミット済みメッセージオフセットを返します。

1
rai.skumar

オフセットステータスを取得するコードを以下で開発しました

import Java.util
import Java.util.{Collections, Properties}

import org.Apache.kafka.clients.consumer.KafkaConsumer
import org.Apache.kafka.common.{PartitionInfo, TopicPartition}
import org.Apache.kafka.common.serialization.StringDeserializer
import scala.collection.JavaConverters._

class GetOffsetRange(consumer:KafkaConsumer[String,String]) {

  def getStartOffsetRange(topic:String):util.HashMap[TopicPartition,Long]={

    val topicPartitionList = consumer.partitionsFor(topic)
    val partitionMap=new util.HashMap[TopicPartition,Long]()
    val arrTopic=new util.ArrayList[TopicPartition]()

    consumer.subscribe(Collections.singletonList(topic));

    for(topic<-topicPartitionList.asScala){
      println(topic.topic() +","+topic.partition())
      arrTopic.add(new TopicPartition(topic.topic(),topic.partition()))
    }

    consumer.poll(0)

    consumer.seekToBeginning(arrTopic)

    for(partition <- arrTopic.asScala){
      partitionMap.put(partition,consumer.position(partition)-1)
    }
    return partitionMap
  }

  def getEndOffsetRange(topic:String):util.HashMap[TopicPartition,Long]={

    val topicPartitionList = consumer.partitionsFor(topic)
    val partitionMap=new util.HashMap[TopicPartition,Long]()
    val arrTopic=new util.ArrayList[TopicPartition]()

    consumer.subscribe(Collections.singletonList(topic));

    for(topic<-topicPartitionList.asScala){
      println(topic.topic() +","+topic.partition())
      arrTopic.add(new TopicPartition(topic.topic(),topic.partition()))
    }

    consumer.poll(0)

    consumer.seekToEnd(arrTopic)

    for(partition <- arrTopic.asScala){
      partitionMap.put(partition,consumer.position(partition)-1)
    }
    return partitionMap
  }
}
1
Jignesh Patel