web-dev-qa-db-fra.com

Récupérer les données basées sur l'horodatage de Kafka

Comment puis-je obtenir des messages ou des données du cluster Kafka pour un jour spécifié? Par exemple, le 13 septembre, quelqu'un peut-il me fournir du code pour cela? Je l'ai googlé et trouvé que la théorie, mais je veux le code

9
jayesh

Il n'y a pas de méthode d'accès pour cela. De même, avant que les messages Kafka v0.10 ne contiennent aucune information d'horodatage, il est donc impossible de savoir quand un message a été écrit dans une rubrique.

À partir de Kafka v0.10, chaque message contient un attribut d'horodatage de métadonnées, qui est défini par le producteur lors de la création du message ou par le courtier lors de l'insertion du message. Un index temporel est prévu, mais pas encore disponible. Ainsi, vous devez utiliser tout le sujet et vérifier le champ d'horodatage (et ignorer tous les messages qui ne vous intéressent pas). Pour trouver le début, vous pouvez également effectuer une recherche binaire sur les décalages et les horodatages afin de trouver le premier message plus rapidement.

Mettre à jour:

Kakfa 0.10.1 ajoute un index temporel. Cela permet à seek du premier enregistrement avec un horodatage égal ou supérieur à l'horodatage donné. Vous pouvez l'utiliser via KafkaConsumer#offsetsForTime(). Cela retournera les décalages correspondants et vous pourrez les alimenter dans KafkaConsumer#seek(). Vous pouvez simplement utiliser les données et consulter le champ d'horodatage des enregistrements via ConsumerRecord#timestamp() pour voir quand vous pouvez arrêter le traitement.

Notez que ces données sont strictement ordonnées par décalages mais pas par horodatage. Ainsi, pendant le traitement, vous pourriez obtenir des enregistrements "en retard" avec un horodatage de plus petit que votre horodatage de départ (vous pouvez simplement ignorer ces enregistrements).

Un problème plus difficile est l'enregistrement tardif à la fin de votre intervalle de recherche. Une fois que vous avez obtenu le premier horodatage avec un horodatage plus grand que votre intervalle de recherche, il se peut que des enregistrements avec horodatage fassent partie de votre intervalle de recherche ultérieurement (si ces enregistrements ont été ajoutés au sujet "en retard"). Il n'y a aucun moyen de savoir cela cependant. Ainsi, vous voudrez peut-être continuer à lire "quelques autres" enregistrements et vérifier s’il existe des enregistrements "en retard". La signification de "certains enregistrements" est une décision de conception que vous devez prendre vous-même.

Il n’ya pas de directive générale cependant - si vous avez des connaissances supplémentaires sur votre "modèle d’écriture", il peut être utile de définir une bonne stratégie pour le nombre d’enregistrements que vous souhaitez utiliser après la fin de votre intervalle de recherche. Bien sûr, il existe deux stratégies par défaut: (1) arrêter le tout premier enregistrement avec un horodatage plus long que l'intervalle de recherche (et ignorer efficacement les enregistrements en retard - si vous utilisez la configuration "log append time", il s'agit bien sûr d'une stratégie sûre. ) (2) vous lisez jusqu'à la fin du journal - il s'agit de la stratégie la plus sûre en ce qui concerne l'exhaustivité, mais elle peut entraîner une surcharge prohibitive (notez également que l'enregistrement peut être ajouté à tout moment et si le "retard" d'un enregistrement peut être arbitrairement élevé, un enregistrement tardif peut même être ajouté après que vous atteignez la fin du journal).

Dans la pratique, il peut être judicieux de penser à un "délai maximum prévu" et de lire jusqu'à ce que vous obteniez un enregistrement avec un horodatage supérieur à ce délai.

26
Matthias J. Sax

obtenir des données d'un jour spécifique à partir de kafka n'est PAS efficace, car les données sont stockées linéairement à l'intérieur de kafka sur le système de stockage de chaque courtier. Par conséquent, même si vous avez un horodatage dans chacun de vos messages ou si vous utilisez les métadonnées de message de kafka susceptibles de contenir l'horodatage dans la version ultérieure du message kafka (> = 0.10), vous devez tout de même analyser l'ensemble du sujet de chaque partition pour obtenir les données. en raison du fait que les données à l'intérieur de kafka ne sont pas indexées par date mais seulement décalées.
Rappelez-vous, kafka est une file d’attente, PAS une base de données. si vous voulez que ce modèle de récupération basé sur la date, vous souhaitiez peut-être envisager de stocker le message kafka dans un autre système de bases de données approprié et utilisez timestamp comme index. 

0
linehrr