web-dev-qa-db-ja.com

Kafka=各トピックのオフセットをどのように保存しますか?

Kafkaのポーリング中に、subscribe()関数を使用して複数のトピックをサブスクライブしました。ここで、トピックからのseek()およびpoll()のたびに再サブスクライブすることなく、各トピックから読み取るオフセットを設定します。トピック名のそれぞれに対してseek()を繰り返し呼び出し、データをポーリングする前に結果を達成しますか?オフセットはどのようにカフカに正確に保存されますか?

トピックごとに1つのパーティションがあり、すべてのトピックから読み取るコンシューマが1つだけです。

14
Raunaq Kochar

Kafka=各トピックのオフセットをどのように保存しますか?

Kafkaは、オフセットストレージをzookeeperからkafkaブローカーに移動しました。理由は以下のとおりです。

zookeeperはオフセット書き込みなどの高書き込み負荷を処理するのに適した方法ではありません。zookeeperは各書き込みをすべてのノードにルーティングするため、書き込みをパーティション化またはスケーリングする機能がないためです。私たちは常にこれを知っていましたが、zkにすでに依存していたため、この実装を一種の「便利な結婚」として選択しました。

Kafkaは、オフセットコミットをトピックに格納します。コンシューマがオフセットをコミットすると、kafka=コミットオフセットメッセージを「commit-log」トピックに発行し、グループ/トピックをマップしたメモリ内構造を保持します/高速な検索のための最新のオフセットへのパーティション詳細な設計情報は、このページにあります オフセット管理に関するページ

次に、トピックからのseek()およびpoll()のたびにサブスクライブすることなく、各トピックから読み取るオフセットを設定します。

kafka=オフセットをリセットする管理ツールに関する新機能があります。

kafka-consumer-group.sh --bootstrap-server 127.0.0.1:9092 --group
      your-consumer-group **--reset-offsets** --to-offset 1 --all-topics --execute

使用できるその他のオプション があります。

25
GuangshengZuo

実際には オフセットを保存するZookeeper です。

次に、コンシューマーでおよび特定のgroup_idで、次のように特定のトピックから読み取ることを選択できます。

  • トピック内のすべてのメッセージ
  • すべての新しいメッセージ

そのためには、プロパティを使用できます。

props.put(ConsumerConfig.AUTO_OFFSET_RESET_CONFIG, "earliest"); 

「最も早い」他のオプションの代わりに:

  • earliest:オフセットを自動的に最も早いオフセットにリセットします
  • latest:オフセットを最新のオフセットに自動的にリセットします
  • none:前のオフセットが見つからない場合、またはコンシューマーのグループが見つからない場合、コンシューマーに例外をスローします
  • その他:例外をコンシューマにスローします。

これはKafkaコンシューマーのサンプルです:

public class ConsumerGroup {
   public static void main(String[] args) throws Exception {
      if(args.length < 2){
         System.out.println("Usage: consumer <topic> <groupname>");
         return;
      }

      String topic = args[0];
      String group = args[1];
      Properties props = new Properties();
      props.put("bootstrap.servers", "localhost:9092");
      props.put("group.id", group);
      props.put("enable.auto.commit", "true");
      props.put("auto.commit.interval.ms", "1000");
      props.put("session.timeout.ms", "30000");
      props.put(ConsumerConfig.AUTO_OFFSET_RESET_CONFIG, "earliest"); 
      props.put("key.deserializer",          
         "org.Apache.kafka.common.serializa-tion.StringDeserializer");
      props.put("value.deserializer", 
         "org.Apache.kafka.common.serializa-tion.StringDeserializer");
      KafkaConsumer<String, String> consumer = new KafkaConsumer<>(props);

      consumer.subscribe(Arrays.asList(topic));
      System.out.println("Subscribed to topic " + topic);
      int i = 0;

      while (true) {
         ConsumerRecords<String, String> records = con-sumer.poll(100);
            for (ConsumerRecord<String, String> record : records)
               System.out.printf("offset = %d, key = %s, value = %s\n", 
               record.offset(), record.key(), record.value());
      }     
   }  
}
0
Ignacio Alorre

Kafkaのオフセットは、コンシューマー側に格納されます。各コンシューマーは、通常はzookeeperに各トピックのオフセットを格納します。

0
Solo