C'è un modo per eliminare tutti i dati da un argomento o eliminare l'argomento prima di ogni esecuzione?


87

C'è un modo per eliminare tutti i dati da un argomento o eliminare l'argomento prima di ogni esecuzione?

Posso modificare il file KafkaConfig.scala per cambiare la logRetentionHoursproprietà? C'è un modo in cui i messaggi vengono eliminati non appena il consumatore li legge?

Sto usando i produttori per recuperare i dati da qualche parte e inviando i dati a un particolare argomento in cui un consumatore consuma, posso eliminare tutti i dati da quell'argomento ad ogni esecuzione? Voglio solo nuovi dati ogni volta nell'argomento. C'è un modo per reinizializzare l'argomento in qualche modo?


Risposte:


62

Non credo che sia ancora supportato. Dai un'occhiata a questo problema di JIRA "Aggiungi supporto per l'eliminazione dell'argomento".

Per eliminare manualmente:

  1. Arresta il cluster
  2. Pulisci la directory del registro di kafka (specificata dall'attributo log.dirnel file di configurazione di kafka ) così come i dati del guardiano dello zoo
  3. Riavvia il cluster

Per qualsiasi argomento quello che puoi fare è

  1. Smetti di kafka
  2. Pulire registro Kafka specifico per partizione, Kafka memorizza il file di log in un formato di "logdir / argomento-partition" così per un argomento denominato "MyTopic" il registro per la partizione id 0 verrà memorizzato in /tmp/kafka-logs/MyTopic-0cui /tmp/kafka-logsviene specificato dal log.dirdell'attributo
  3. Riavvia kafka

Questo è NOTun approccio valido e consigliato ma dovrebbe funzionare. Nel file di configurazione del broker Kafka l' log.retention.hours.per.topicattributo viene utilizzato per definireThe number of hours to keep a log file before deleting it for some specific topic

Inoltre, esiste un modo in cui i messaggi vengono eliminati non appena il consumatore li legge?

Dalla documentazione di Kafka :

Il cluster Kafka conserva tutti i messaggi pubblicati, che siano stati consumati o meno, per un periodo di tempo configurabile. Ad esempio, se la conservazione del registro è impostata su due giorni, per i due giorni successivi alla pubblicazione un messaggio è disponibile per il consumo, dopodiché verrà scartato per liberare spazio. Le prestazioni di Kafka sono effettivamente costanti rispetto alla dimensione dei dati, quindi conservare molti dati non è un problema.

In effetti gli unici metadati conservati per consumatore sono la posizione del consumatore nel log, chiamato "offset". Questo offset è controllato dal consumatore: normalmente un consumatore avanza il suo offset linearmente mentre legge i messaggi, ma in realtà la posizione è controllata dal consumatore e può consumare i messaggi nell'ordine che preferisce. Ad esempio, un consumatore può ripristinare un vecchio offset per rielaborare.

Per trovare l'offset iniziale da leggere nell'esempio di Kafka 0.8 Simple Consumer , dicono

Kafka include due costanti per aiutare, kafka.api.OffsetRequest.EarliestTime()trova l'inizio dei dati nei log e avvia lo streaming da lì, kafka.api.OffsetRequest.LatestTime()trasmetterà solo i nuovi messaggi.

Puoi anche trovare il codice di esempio per la gestione dell'offset presso il tuo consumatore.

    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];
}

Credo che il collegamento corretto al problema JIRA sia issues.apache.org/jira/browse/KAFKA-330
asmaier

4
L'argomento verrà comunque visualizzato qui perché è elencato nel guardiano dello zoo. Dovrai eliminare in modo ricorsivo tutto sotto brokers/topics/<topic_to_delete>così come i log per sbarazzartene.
Presentato

3
Secondo il collegamento al problema, è possibile eliminare un argomento dopo la versione 0.8.1. È possibile visualizzare la guida dettagliata da kafka-run-class.sh kafka.admin.DeleteTopicCommand.
Jay

5
Aggiornamento: a partire da kafka 0.8.2 il comando è cambiato in:kafka-run-class.sh kafka.admin.TopicCommand --delete --topic [topic_to_delete] --zookeeper localhost:2181
Jay Taylor

Penso che questa funzionalità di abilitazione dell'eliminazione degli argomenti sia stata ora aggiunta. Probabilmente la prossima versione stabile ce l'avrà.
ha9u63ar

70

Come ho accennato qui Purge Kafka Queue :

Testato in Kafka 0.8.2, per l'esempio di avvio rapido: in primo luogo, aggiungi una riga al file server.properties nella cartella config:

delete.topic.enable=true

quindi, puoi eseguire questo comando:

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

2
A proposito, non è necessario riavviare il server Kafka dopo aver aggiunto l'opzione, nel caso qualcuno se lo stesse chiedendo.
problemofficer

14

Testato con 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.

Nota: se stai eliminando le cartelle degli argomenti all'interno di kafka-logs ma non dalla cartella dei dati del guardiano dello zoo, vedrai che gli argomenti sono ancora lì.


8

Come soluzione alternativa, puoi regolare le impostazioni di conservazione del runtime per argomento, ad esempio bin/kafka-topics.sh --zookeeper localhost:2181 --alter --topic my_topic --config retention.bytes=1(anche retention.bytes = 0 potrebbe funzionare)

Dopo poco kafka dovrebbe liberare lo spazio. Non sono sicuro che ciò abbia delle implicazioni rispetto alla ricreazione dell'argomento.

ps. È meglio ripristinare le impostazioni di conservazione, una volta che kafka ha terminato la pulizia.

È inoltre possibile utilizzare retention.msper rendere persistenti i dati storici


8

Di seguito sono riportati gli script per lo svuotamento e l'eliminazione di un argomento Kafka assumendo localhost come server guardiano dello zoo e Kafka_Home è impostato sulla directory di installazione:

Lo script seguente svuoterà un argomento impostando il tempo di conservazione a 1 secondo e quindi rimuovendo la configurazione:

#!/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

Per eliminare completamente gli argomenti, è necessario arrestare tutti i broker kafka applicabili e rimuovere le relative directory dalla directory dei log di kafka (impostazione predefinita: / tmp / kafka-logs) e quindi eseguire questo script per rimuovere l'argomento dal guardiano dello zoo. Per verificare che sia stato eliminato da zookeeper, l'output di ls / brokers / topics non dovrebbe più includere l'argomento:

#!/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

1
Funzionerà solo se il controllo della conservazione avviene entro quei 5 secondi di sospensione. Assicurati di dormire finché il controllo non sarà definitivamente superato come specificato qui:grep "log.retention.check.interval" $Kafka_Home/config/server.properties
colin

2
Volevo modificare la risposta perché c'è un piccolo errore nel primo comando. Ma le modifiche di un carattere non sono consentite. In realtà non è --add configpiuttosto lo è--add-config
SRC

7

Abbiamo provato più o meno quello che descrivono le altre risposte con un moderato livello di successo. Ciò che ha funzionato davvero per noi (Apache Kafka 0.8.1) è il comando class

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


2
Ho provato in 0.8.1. Il comando restituisce "eliminazione riuscita!" tuttavia non elimina le partizioni all'interno delle cartelle di registro.
dilm

8
Ho provato su 0.8.2.1 (homebrew) e dà questo errore. Error: Could not find or load main class kafka.admin.DeleteTopicCommand
Thanish

2
A partire dal nuovo kafka (0.8.2), è sh kafka-run-class.sh kafka.admin.TopicCommand --delete --topic [topic_for_delete] --zookeeper localhost: 2181. Assicurati che delete.topic.enable sia vero.
Hoàng Long,

3

Per gli utenti della birra

Se usi brewcome me e hai perso molto tempo a cercare la famigerata kafka-logscartella, non temere più. (e per favore fammi sapere se funziona per te e per più versioni diverse di Homebrew, Kafka ecc :))

Probabilmente lo troverai sotto:

Posizione:

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


Come trovare effettivamente quel percorso

(questo è anche utile praticamente per ogni app che installi tramite brew)

1) brew services list

kafka ha avviato matbhz /Users/matbhz/Library/LaunchAgents/homebrew.mxcl.kafka.plist

2) Apri e leggi quello che plisthai trovato sopra

3) Trova la linea che definisce la server.propertiesposizione aprila, nel mio caso:

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

4) Cerca la log.dirslinea:

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

5) Vai in quella posizione ed elimina i log per gli argomenti che desideri

6) Riavvia Kafka con brew services restart kafka


2

Tutti i dati sugli argomenti e le sue partizioni vengono archiviati in tmp/kafka-logs/. Inoltre sono memorizzati in un formato topic-partionNumber, quindi se vuoi eliminare un argomento newTopic, puoi:

  • smetti di kafka
  • eliminare i file rm -rf /tmp/kafka-logs/newTopic-*

1
  1. Ferma ZooKeeper e Kafka
  2. In server.properties, modificare il valore log.retention.hours. Puoi commentare log.retention.hourse aggiungere log.retention.ms=1000. Manterrebbe il record su Kafka Topic solo per un secondo.
  3. Avvia guardiano dello zoo e kafka.
  4. Controlla sulla console del consumatore. Quando ho aperto la console per la prima volta, il record era lì. Ma quando ho riaperto la console, il record è stato rimosso.
  5. Successivamente, puoi impostare il valore di log.retention.hourssulla cifra desiderata.

1

A partire dalla versione di kafka 2.3.0, esiste un modo alternativo per eliminare gradualmente Kafka (il vecchio approccio è deprecato).

Aggiorna retention.ms a 1 sec (1000ms), quindi impostalo di nuovo dopo un minuto, all'impostazione predefinita, ovvero 7 giorni (168 ore, 604,800,000 in ms)

Cancellazione graduale : - (rentention.ms = 1000) (utilizzando kafka-configs.sh)

bin/kafka-configs.sh --zookeeper 192.168.1.10:2181 --alter --entity-name kafka_topic3p3r --entity-type topics  --add-config retention.ms=1000
Completed Updating config for entity: topic 'kafka_topic3p3r'.

Impostazione predefinita: - 7 giorni (168 ore, retention.ms = 604800000)

bin/kafka-configs.sh --zookeeper 192.168.1.10:2181 --alter --entity-name kafka_topic3p3r --entity-type topics  --add-config retention.ms=604800000


0

Uso questo 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

0

Utilizzo l'utilità di seguito per eseguire la pulizia dopo l'esecuzione del test di integrazione.

Utilizza l'ultima AdminZkClientapi. La vecchia API è stata deprecata.

import javax.inject.Inject
import kafka.zk.{AdminZkClient, KafkaZkClient}
import org.apache.kafka.common.utils.Time

class ZookeeperUtils @Inject() (config: AppConfig) {

  val testTopic = "users_1"

  val zkHost = config.KafkaConfig.zkHost
  val sessionTimeoutMs = 10 * 1000
  val connectionTimeoutMs = 60 * 1000
  val isSecure = false
  val maxInFlightRequests = 10
  val time: Time = Time.SYSTEM

  def cleanupTopic(config: AppConfig) = {

    val zkClient = KafkaZkClient.apply(zkHost, isSecure, sessionTimeoutMs, connectionTimeoutMs, maxInFlightRequests, time)
    val zkUtils = new AdminZkClient(zkClient)

    val pp = new Properties()
    pp.setProperty("delete.retention.ms", "10")
    pp.setProperty("file.delete.delay.ms", "1000")
    zkUtils.changeTopicConfig(testTopic , pp)
    //    zkUtils.deleteTopic(testTopic)

    println("Waiting for topic to be purged. Then reset to retain records for the run")
    Thread.sleep(60000L)

    val resetProps = new Properties()
    resetProps.setProperty("delete.retention.ms", "3000000")
    resetProps.setProperty("file.delete.delay.ms", "4000000")
    zkUtils.changeTopicConfig(testTopic , resetProps)

  }


}

C'è un'opzione elimina argomento. Ma segna l'argomento per l'eliminazione. Zookeeper successivamente elimina l'argomento. Poiché questo può essere imprevedibilmente lungo, preferisco l'approccio retention.ms

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.