web-dev-qa-db-fra.com

Comment Kafka stocke-t-il les décalages pour chaque sujet?

Lors de l'interrogation de Kafka, j'ai souscrit à plusieurs sujets à l'aide de la fonction subscribe(). Maintenant, je veux définir le décalage à partir duquel je veux lire chaque sujet, sans avoir à vous réabonner après chaque seek() et poll() à partir d'un sujet. Si vous appelez seek() de manière itérative sur chacun des noms de sujet, avant de rechercher des données obtenez le résultat?

J'ai une partition par sujet et un seul consommateur à lire de tous les sujets.

7
Raunaq Kochar

Comment Kafka stocke-t-il des décalages pour chaque sujet?

Kafka a déplacé la mémoire offset des gardiens de zoo au courtier kafka. La raison est ci-dessous:

Zookeeper n'est pas un bon moyen de gérer une charge en écriture élevée telle que les mises à jour d'offset, car zookeeper route chaque écriture à travers chaque nœud et n'a donc aucune possibilité de partitionner ou de redimensionner les écritures. Nous avons toujours su cela, mais avons choisi cette implémentation comme une sorte de "mariage de raison" puisque nous dépendions déjà de zk.

Kafka stocke les validations d'offset dans une rubrique, lorsque le consommateur les valide, il publie un message d'offset de validation dans une rubrique "commit-log" et conserve une structure en mémoire qui mappe le groupe/le sujet/la partition sur l'offset le plus récent pour une récupération rapide. . Vous trouverez plus d’informations sur la conception dans cette page sur la gestion des décalages .

Maintenant, je veux définir le décalage à partir duquel je veux lire chaque sujet, sans avoir à vous réabonner après chaque seek () et poll () d'un sujet.

Une nouvelle fonctionnalité sur les outils d’administration de kafka permet de réinitialiser le décalage. 

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

Il y a plus d'options que vous pouvez utiliser .

18
GuangshengZuo

En fait, c’est le Zookeeper qui enregistre les décalages .

Ensuite, dans le consommateur, et pour un groupe_id particulier, vous pouvez choisir de lire un sujet spécifique comme suit:

  • tous les messages dans le sujet 
  • tous les nouveaux messages

Pour cela, vous pouvez utiliser la propriété:

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

Au lieu de "plus tôt", d'autres options sont:

  • premier: réinitialise automatiquement le décalage sur le premier décalage
  • dernière: réinitialise automatiquement le décalage sur le dernier décalage
  • none: renvoie une exception au consommateur si aucun décalage précédent n'est trouvé ou le groupe du consommateur
  • toute autre chose: jetez une exception au consommateur.

Voici un exemple de consommateur de 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

Les crédits de Kafka sont stockés du côté du consommateur. Chaque consommateur stockera son décalage de chaque sujet, généralement dans le gardien de zoo.

0
Solo