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?
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:
log.dir
dans kafka config fichier) ainsi que les données du gardien de zookPour un sujet donné, vous pouvez faire
/tmp/kafka-logs/MyTopic-0
où /tmp/kafka-logs
est spécifié par l'attribut log.dir
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];
}
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
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à.
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
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
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.
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:
rm -rf /tmp/kafka-logs/newTopic-*
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:
/usr/local/var/lib/kafka-logs
(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
log.retention.hours
et ajouter log.retention.ms=1000
. Cela garderait le disque sur Kafka Topic pendant une seconde seulement. log.retention.hours
à la valeur souhaitée.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.