web-dev-qa-db-fra.com

Comment obtenir des données de l'ancien point de décalage à Kafka?

J'utilise zookeeper pour obtenir des données de Kafka. Et ici, je reçois toujours les données du dernier point de décalage. Est-il possible de spécifier le temps de décalage pour récupérer les anciennes données?

Il y a une option autooffset.reset. Il accepte le plus petit ou le plus grand. Quelqu'un peut-il s'il vous plaît expliquer ce qui est le plus petit et le plus grand. Autooffset.reset peut-il aider à obtenir des données de l'ancien point de décalage au lieu du dernier point de décalage?

35
Sourabh

Les consommateurs appartiennent toujours à un groupe et, pour chaque partition, le Zookeeper suit l'évolution de ce groupe de consommateurs dans la partition.

Pour extraire depuis le début, vous pouvez supprimer toutes les données associées à Progress, comme indiqué par Hussain.

ZkUtils.maybeDeletePath(${zkhost:zkport}", "/consumers/${group.id}");

Vous pouvez également spécifier le décalage de partition que vous souhaitez, comme indiqué dans core/src/main/scala/kafka/tools/UpdateOffsetsInZK.scala.

ZkUtils.updatePersistentPath(zkClient, topicDirs.consumerOffsetDir + "/" + partition, offset.toString)

Cependant, le décalage n'est pas indexé dans le temps, mais vous savez que chaque partition est une séquence.

Si votre message contient un horodatage (et que cet horodatage n’a aucun rapport avec le moment où Kafka a reçu votre message), vous pouvez essayer de créer un indexeur qui tente de récupérer une entrée par étapes en incrémentant le décalage de N Tuple (sujet X, partie 2, offset 100, horodatage) quelque part.

Lorsque vous souhaitez récupérer des entrées à partir d'un moment précis, vous pouvez appliquer une recherche binaire à votre index approximatif jusqu'à ce que vous trouviez l'entrée souhaitée et que vous la récupériez à partir de là.

24
Alex Rodrigues

Kafka documentation dit-on "Kafka.api.OffsetRequest.EarliestTime () trouve le début des données dans les journaux et commence à se diffuser à partir de là. nouveaux messages. Ne supposez pas que le décalage 0 est le décalage de début, car les messages expirent dans le journal avec le temps. "

Utilisez le SimpleConsumerExample ici: https://cwiki.Apache.org/confluence/display/KAFKA/0.8.0+SimpleConsumer+Example

Question similaire: Consommateur de haut niveau Kafka Récupérer tous les messages de la rubrique à l’aide de l’API Java (équivalent à --from-begin)

Cela pourrait aider

8
Hild

Reportez-vous à la documentation sur kafka config: http://kafka.Apache.org/08/configuration.html pour votre requête sur les valeurs les plus petites et les plus grandes du paramètre offset.

BTW, tout en explorant kafka, je me demandais comment rejouer tous les messages pour un consommateur. Je veux dire si un groupe de consommateurs a interrogé tous les messages et veut les récupérer. 

Pour ce faire, vous devez supprimer les données de zookeeper. Utilisez la classe kafka.utils.ZkUtils pour supprimer un nœud sur Zookeeper. Ci-dessous est son utilisation:

ZkUtils.maybeDeletePath(${zkhost:zkport}", "/consumers/${group.id}");
3
Hussain Pirosha

Pour l'instant

Kafka FAQ donne une réponse à ce problème.

Comment obtenir avec précision des décalages de messages pour un horodatage donné en utilisant OffsetRequest?

Kafka permet d'interroger les décalages de messages par heure, de la granularité de segment. Le paramètre timestamp est l'horodatage unix et l'interrogation de l'offset par horodatage renvoie le dernier offset possible du message ajouté au plus tard à l'horodatage donné. Il y a 2 valeurs spéciales de l'horodatage - la plus récente et la plus ancienne. Pour toute autre valeur de l'horodatage unix, Kafka obtiendra l'offset de départ du segment de journal créé au plus tard à l'horodatage donné. De ce fait, et comme la demande d'offset n'est servie que selon la granularité du segment, la requête d'extraction d'offset renvoie des résultats moins précis pour des segments de taille supérieure.

Pour des résultats plus précis, vous pouvez configurer la taille du segment de journal en fonction de l'heure (log.roll.ms) au lieu de la taille (log.segment.bytes). Il convient toutefois de prendre des précautions, car cela pourrait augmenter le nombre de gestionnaires de fichiers en raison de la rotation fréquente des segments de journal.


Plan d'avenir

Kafka ajoutera un horodatage au format du message. Faire référence à 

https://cwiki.Apache.org/confluence/display/KAFKA/Kafka+Enriched+Message+Metadata

2
zheolong

Kafka Protocol Doc est une excellente source pour jouer avec demande/réponse/compensations/messages: https://cwiki.Apache.org/confluence/display/KAFKA/A+Guide+To+The+Kafka+Protocol vous utilisez l'exemple Simple Consumer comme où le code suivant montre l'état:

FetchRequest req = new FetchRequestBuilder()

        .clientId(clientName)

        .addFetch(a_topic, a_partition, readOffset, 100000) 

        .build();

FetchResponse fetchResponse = simpleConsumer.fetch(req);

définissez readOffset pour commencer le décalage initial. mais vous devez vérifier que l'offset maximum ainsi que ci-dessus fournira un nombre limité de décalages selon FetchSize dans le dernier paramètre de la méthode addFetch.

1
usman

En utilisant KafkaConsumer, vous pouvez utiliser Seek, SeekToBeginning et SeekToEnd pour vous déplacer dans le flux.

https://kafka.Apache.org/0100/javadoc/org/Apache/kafka/clients/consumer/KafkaConsumer.html#seekToBeginning(Java.util.Collection)

En outre, si aucune partition n'est fournie, le premier offset sera recherché pour toutes les partitions actuellement attribuées.

0
CamW

avez-vous essayé cela? 

bin/kafka-console-consumer.sh --bootstrap-server localhost: 9092 --testic test --de début

Il afficherait tous les messages pour le sujet donné, "test" dans cet exemple. 

Plus de détails sur ce lien https://kafka.Apache.org/quickstart

0
Gang Peng