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.