web-dev-qa-db-fra.com

Existe-t-il un moyen de supprimer toutes les données d'un sujet ou de supprimer le sujet avant chaque exécution?

Existe-t-il un moyen de supprimer toutes les données d'un sujet ou de supprimer le sujet avant chaque exécution?

Puis-je modifier le fichier KafkaConfig.scala pour modifier la propriété logRetentionHours? Existe-t-il un moyen de supprimer les messages dès que le consommateur les lit?

J'utilise des producteurs pour récupérer les données quelque part et les envoyer à un sujet particulier consommé par un consommateur. Puis-je supprimer toutes les données de ce sujet à chaque exécution? Je veux seulement de nouvelles données à chaque fois dans le sujet. Est-il possible de réinitialiser le sujet d'une manière ou d'une autre?

63
TommyT

Ne pensez pas qu'il est encore supporté. Jetez un oeil à ce problème JIRA "Ajouter un support de suppression de sujet".

Pour supprimer manuellement:

  1. Arrêtez le cluster
  2. Nettoyez le répertoire du journal kafka (spécifié par l’attribut log.dir dans kafka config fichier) ainsi que les données du gardien de zook
  3. Redémarrer le cluster

Pour un sujet donné, vous pouvez faire

  1. Arrête kafka
  2. Nettoyez le journal kafka spécifique à la partition. Kafka stocke son fichier journal au format "logDir/topic-partition". Ainsi, pour une rubrique nommée "MyTopic", le journal de la partition id 0 sera stocké dans /tmp/kafka-logs/MyTopic-0/tmp/kafka-logs est spécifié par l'attribut log.dir
  3. Redémarrer Kafka

Ceci est NOT une bonne approche recommandée, mais cela devrait fonctionner. Dans le fichier de configuration du courtier Kafka, l'attribut log.retention.hours.per.topic est utilisé pour définir The number of hours to keep a log file before deleting it for some specific topic

En outre, existe-t-il un moyen de supprimer les messages dès que le consommateur les lit?

De la Documentation Kafka :

Le cluster Kafka conserve tous les messages publiés, qu'ils aient été consommés ou non, pendant une période configurable. Par exemple, si la conservation du journal est définie sur deux jours, il est disponible pour la consommation des deux jours suivant la publication du message, après quoi il sera supprimé pour libérer de l'espace. Les performances de Kafka sont en réalité constantes en ce qui concerne la taille des données, de sorte que la conservation d'une grande quantité de données ne pose pas de problème.

En fait, les seules métadonnées retenues par consommateur sont la position du consommateur dans le journal, appelée "décalage". Ce décalage est contrôlé par le consommateur: normalement, le consommateur avance linéairement lorsqu’il lit les messages, mais en réalité, la position est contrôlée par le consommateur et peut consommer les messages dans l’ordre qu’il souhaite. Par exemple, un consommateur peut réinitialiser un offset plus ancien à retraiter.

Pour trouver le décalage de début à lire dans Kafka 0.8 Exemple de consommation simple dit-on

Kafka inclut deux constantes pour aider, kafka.api.OffsetRequest.EarliestTime() trouve le début des données dans les journaux et commence la diffusion à partir de là, kafka.api.OffsetRequest.LatestTime() ne diffusera que les nouveaux messages.

Vous pouvez également y trouver l'exemple de code permettant de gérer l'offset chez votre consommateur.

    public static long getLastOffset(SimpleConsumer consumer, String topic, int partition,
                                 long whichTime, String clientName) {
    TopicAndPartition topicAndPartition = new TopicAndPartition(topic, partition);
    Map<TopicAndPartition, PartitionOffsetRequestInfo> requestInfo = new HashMap<TopicAndPartition, PartitionOffsetRequestInfo>();
    requestInfo.put(topicAndPartition, new PartitionOffsetRequestInfo(whichTime, 1));
    kafka.javaapi.OffsetRequest request = new kafka.javaapi.OffsetRequest(requestInfo, kafka.api.OffsetRequest.CurrentVersion(),clientName);
    OffsetResponse response = consumer.getOffsetsBefore(request);

    if (response.hasError()) {
        System.out.println("Error fetching data Offset Data the Broker. Reason: " + response.errorCode(topic, partition) );
        return 0;
    }
    long[] offsets = response.offsets(topic, partition);
    return offsets[0];
}
45
Hild

Comme je l'ai mentionné ici Purge Kafka Queue :

Testé dans Kafka 0.8.2, pour l'exemple de démarrage rapide: Tout d'abord, ajoutez une ligne au fichier server.properties sous le dossier config:

delete.topic.enable=true

alors, vous pouvez exécuter cette commande:

bin/kafka-topics.sh --zookeeper localhost:2181 --delete --topic test
42
Patrick

Testé avec du kafka 0.10

1. stop zookeeper & Kafka server,
2. then go to 'kafka-logs' folder , there you will see list of kafka topic folders, delete folder with topic name
3. go to 'zookeeper-data' folder , delete data inside that.
4. start zookeeper & kafka server again.

Remarque: si vous supprimez le dossier du sujet/s dans kafka-logs mais pas dans le dossier zookeeper-data, vous verrez que les sujets sont toujours là.

13
Swadeshi

Vous trouverez ci-dessous des scripts permettant de vider et de supprimer une rubrique Kafka en supposant que localhost est le serveur zookeeper et que Kafka_Home est défini dans le répertoire d'installation:

Le script ci-dessous va vide un sujet en définissant son temps de rétention sur 1 seconde, puis en supprimant la configuration:

#!/bin/bash
echo "Enter name of topic to empty:"
read topicName
/$Kafka_Home/bin/kafka-configs --zookeeper localhost:2181 --alter --entity-type topics --entity-name $topicName --add-config retention.ms=1000
sleep 5
/$Kafka_Home/bin/kafka-configs --zookeeper localhost:2181 --alter --entity-type topics --entity-name $topicName --delete-config retention.ms

Pour supprimer complètement topics, vous devez arrêter tous les courtiers kafka applicables et supprimer son ou ses répertoires du répertoire de journalisation kafka (par défaut:/tmp/kafka-logs), puis exécuter ce script pour supprimer le sujet. gardien de zoo. Pour vérifier qu'il a été supprimé de zookeeper, la sortie de ls/brokers/topics ne devrait plus inclure le sujet: 

#!/bin/bash
echo "Enter name of topic to delete from zookeeper:"
read topicName
/$Kafka_Home/bin/zookeeper-Shell localhost:2181 <<EOF
rmr /brokers/topics/$topicName
ls /brokers/topics
quit
EOF
6
vdlen

Nous avons essayé à peu près ce que les autres réponses décrivent avec un niveau de réussite moyen . Ce qui a vraiment fonctionné pour nous (Apache Kafka 0.8.1) est la commande de classe

sh kafka-run-class.sh kafka.admin.DeleteTopicCommand --topic yourtopic --zookeeper localhost: 2181

5
Dan M

En guise de solution de contournement, vous pouvez ajuster les paramètres de rétention d'exécution par sujet, par exemple. bin/kafka-topics.sh --zookeeper localhost:2181 --alter --topic my_topic --config retention.bytes=1 ( retention.bytes = 0 pourrait également fonctionner)

Après un court instant, Kafka devrait libérer l'espace. Je ne sais pas si cela a des implications par rapport à la re-création du sujet. 

ps. Mieux vaut rétablir les paramètres de rétention, une fois kafka terminé avec le nettoyage.

Vous pouvez également utiliser retention.ms pour conserver des données historiques.

5
Ivan Balashov

Toutes les données sur les sujets et leurs partitions sont stockées dans tmp/kafka-logs/. De plus, ils sont stockés dans un format topic-partionNumber. Ainsi, si vous souhaitez supprimer un sujet newTopic, vous pouvez:

  • arrête kafka
  • supprimer les fichiers rm -rf /tmp/kafka-logs/newTopic-*
2
Salvador Dali

Pour les utilisateurs de brasseries

Si vous utilisez brew comme moi et que vous avez perdu beaucoup de temps à chercher le fameux dossier kafka-logs, ne craignez plus. (et s'il vous plaît faites le moi savoir si cela fonctionne pour vous et plusieurs versions différentes de Homebrew, Kafka etc :))

Vous allez probablement le trouver sous:

Emplacement:

/usr/local/var/lib/kafka-logs


Comment trouver réellement ce chemin

(Ceci est également utile pour pratiquement chaque application que vous installez par brassage)

1) brew services list

kafka a commencé matbhz /Users/matbhz/Library/LaunchAgents/homebrew.mxcl.kafka.plist

2) Ouvrez et lisez que plist vous avez trouvé ci-dessus

3) Trouvez la ligne définissant server.properties emplacement ouvrez-la, dans mon cas:

  • /usr/local/etc/kafka/server.properties

4) Recherchez la ligne log.dirs:

log.dirs =/usr/local/var/lib/kafka-logs

5) Accédez à cet emplacement et supprimez les journaux des sujets que vous souhaitez.

6) Redémarrez Kafka avec brew services restart kafka

1
Matheus Felipe
  1. Arrêtez ZooKeeper et Kafka 
  2. Dans server.properties, modifiez la valeur log.retention.hours. Vous pouvez commenter log.retention.hours et ajouter log.retention.ms=1000. Cela garderait le disque sur Kafka Topic pendant une seconde seulement. 
  3. Commencez gardien de zoo et kafka. 
  4. Vérifiez sur la console du consommateur. Lorsque j'ai ouvert la console pour la première fois, l'enregistrement était là. Mais lorsque j'ai rouvert la console, l'enregistrement a été supprimé. 
  5. Plus tard, vous pourrez définir la valeur de log.retention.hours à la valeur souhaitée.
1
earl

J'utilise ce script:

#!/bin/bash
topics=`kafka-topics --list --zookeeper zookeeper:2181`
for t in $topics; do 
    for p in retention.ms retention.bytes segment.ms segment.bytes; do
        kafka-topics --zookeeper zookeeper:2181 --alter --topic $t --config ${p}=100
    done
done
sleep 60
for t in $topics; do 
    for p in retention.ms retention.bytes segment.ms segment.bytes; do
        kafka-topics --zookeeper zookeeper:2181 --alter --topic $t --delete-config ${p}
    done
done

En supprimant manuellement un sujet d'un cluster kafka, vous pouvez simplement vérifier ceci https://github.com/darrenfu/bigdata/issues/6 Une étape essentielle qui manque souvent dans la plupart des solutions consiste à supprimer le /config/topics/<topic_name> en ZK. 

0