it-swarm.com.de

Purge Kafka Topic

Ich habe eine zu große Nachricht in ein kafka Nachrichtenthema auf meinem lokalen Computer verschoben, jetzt erhalte ich eine Fehlermeldung:

kafka.common.InvalidMessageSizeException: invalid message size

Erhöhung der fetch.size ist hier nicht ideal, weil ich eigentlich keine so großen Nachrichten annehmen möchte. Gibt es eine Möglichkeit, das Thema in kafka zu löschen?

152
Peter Klipfel

Aktualisieren Sie die Aufbewahrungszeit für das Thema vorübergehend auf eine Sekunde:

kafka-topics.sh --zookeeper <zkhost>:2181 --alter --topic <topic name> --config retention.ms=1000

Und in neueren Kafka Releases können Sie dies auch mit kafka-configs --entity-type topics Tun.

kafka-configs.sh --zookeeper <zkhost>:2181 --entity-type topics --alter --entity-name <topic name> --add-config retention.ms=1000

warten Sie dann, bis die Reinigung wirksam wird (ca. eine Minute). Stellen Sie nach dem Löschen den vorherigen Wert retention.ms Wieder her.

337

m die Warteschlange zu leeren, können Sie das Thema löschen:

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

dann erstelle es neu:

bin/kafka-topics.sh --create --zookeeper localhost:2181 \
    --replication-factor 1 --partitions 1 --topic test
52
rjaiswal

Gehen Sie wie folgt vor, um ein Thema mit dem Namen MyTopic zu löschen:

  1. Beschreiben Sie das Thema und nehmen Sie nicht die Broker-IDs
  2. Stoppen Sie den Apache Kafka für jede aufgelistete Broker-ID.
  3. Stellen Sie eine Verbindung zu jedem Broker her, und löschen Sie den Themendatenordner, z. rm -rf /tmp/kafka-logs/MyTopic-0. Wiederholen Sie diesen Vorgang für alle anderen Partitionen und Replikate
  4. Löschen Sie die Themen-Metadaten: zkCli.sh Dann rmr /brokers/MyTopic
  5. Starten Sie den Apache Kafka Daemon für jede gestoppte Maschine

Wenn Sie Schritt 3 verpassen, meldet Apache Kafka) das Thema weiterhin als vorhanden (z. B. wenn Sie kafka-list-topic.sh Ausführen).

Getestet mit Apache Kafka 0.8.0.

47
Thomas Bratt

Die akzeptierte Antwort ist zwar korrekt, diese Methode ist jedoch veraltet. Die Themenkonfiguration sollte nun über kafka-configs Erfolgen.

kafka-configs --zookeeper localhost:2181 --entity-type topics --alter --add-config retention.ms=1000 --entity-name MyTopic

Über diese Methode eingestellte Konfigurationen können mit dem Befehl angezeigt werden

kafka-configs --zookeeper localhost:2181 --entity-type topics --describe --entity-name MyTopic
40
Shane Perry

Getestet in Kafka 0.8.2, für das Schnellstart-Beispiel: Fügen Sie zunächst eine Zeile zur Datei server.properties im Ordner config hinzu:

delete.topic.enable=true

dann können Sie diesen Befehl ausführen:

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

Von kafka 1.1

Lösche ein Thema

bin/kafka-configs.sh --zookeeper localhost: 2181 --alter --entity-type topics -> - entity-name tp_binance_kline --add-config retention.ms = 100

warten Sie 1 Minute, um sicherzustellen, dass kafka= das Thema löscht, die Konfiguration entfernt und dann zum Standardwert wechselt

bin/kafka-configs.sh --zookeeper localhost: 2181 --alter --entity-type topics -> -entity-name tp_binance_kline --delete-config retention.ms

6
user644265

Wenn ein Cluster überlastet ist (zu viele Partitionen, verschlüsselte Themendaten oder SSL) oder wenn sich der Controller auf einem fehlerhaften Knoten befindet oder die Verbindung instabil ist, dauert es manchmal lange, bis das betreffende Thema gelöscht ist .

Ich folge diesen Schritten, insbesondere wenn Sie Avro verwenden.

1: Mit kafka tools: ausführen

bash kafka-configs.sh --alter --entity-type topics --zookeeper zookeeper01.kafka.com --add-config retention.ms=1 --entity-name <topic-name>

2: Auf dem Schema-Registrierungsknoten ausführen:

kafka-avro-console-consumer --consumer-property security.protocol=SSL --consumer-property ssl.truststore.location=/etc/schema-registry/secrets/trust.jks --consumer-property ssl.truststore.password=password --consumer-property ssl.keystore.location=/etc/schema-registry/secrets/identity.jks --consumer-property ssl.keystore.password=password --consumer-property ssl.key.password=password --bootstrap-server broker01.kafka.com:9092 --topic <topic-name> --new-consumer --from-beginning

3: Setzen Sie die Themenaufbewahrung auf die ursprüngliche Einstellung zurück, sobald das Thema leer ist.

bash kafka-configs.sh --alter --entity-type topics --zookeeper zookeeper01.kafka.com --add-config retention.ms=604800000 --entity-name <topic-name>

Hoffe das hilft jemandem, da es nicht einfach zu bewerben ist.

4
Ben Coughlan

UPDATE: Diese Antwort ist relevant für Kafka 0.6. Für Kafka 0.8 und höher siehe Antwort von @Patrick.

Ja, stoppen Sie kafka und löschen Sie alle Dateien manuell aus dem entsprechenden Unterverzeichnis (es ist einfach, es in kafka data directory) zu finden. Nach kafka Neustart das Thema wird leer sein.

4
Wildfire

kafka hat keine direkte Methode zum Löschen/Bereinigen von Themen (Warteschlangen), kann dies jedoch tun, indem Sie dieses Thema löschen und neu erstellen.

stellen Sie zunächst sicher, dass die Datei sever.properties delete.topic.enable=true enthält.

dann Thema löschen bin/kafka-topics.sh --zookeeper localhost:2181 --delete --topic myTopic

dann erstelle es erneut.

bin/kafka-topics.sh --zookeeper localhost:2181 --create --topic myTopic --partitions 10 --replication-factor 2
3
Manish Jaiswal

Am einfachsten ist es, das Datum der einzelnen Protokolldateien so festzulegen, dass es älter als der Aufbewahrungszeitraum ist. Der Broker sollte sie dann binnen weniger Sekunden bereinigen und für Sie entfernen. Dies bietet mehrere Vorteile:

  1. Broker müssen nicht gestürzt werden, es handelt sich um eine Laufzeitoperation.
  2. Vermeidet die Möglichkeit ungültiger Offset-Ausnahmen (mehr dazu weiter unten).

Nach meiner Erfahrung mit Kafka 0.7.x kann das Entfernen der Protokolldateien und der Neustart des Brokers für bestimmte Konsumenten zu ungültigen Offset - Ausnahmen führen. Dies würde passieren, weil der Broker die Offsets bei Null neu startet (im Fehlen vorhandener Protokolldateien) und ein Konsument, der zuvor das Thema konsumiert hatte, stellte erneut eine Verbindung her, um einen bestimmten [einmal gültigen] Offset anzufordern. Wenn dieser Offset außerhalb der Grenzen der neuen Themenprotokolle liegt, ist dies kein Schaden Der Consumer wird entweder am Anfang oder am Ende fortgesetzt. Wenn der Versatz jedoch innerhalb der Grenzen der neuen Themenprotokolle liegt, versucht der Broker, den Nachrichtensatz abzurufen, schlägt jedoch fehl, da der Versatz nicht an einer tatsächlichen Nachricht ausgerichtet ist.

Dies könnte gemildert werden, indem auch die Verbrauchervergleiche in zookeeper für dieses Thema gelöscht werden. Wenn Sie jedoch kein jungfräuliches Thema benötigen und nur die vorhandenen Inhalte entfernen möchten, ist es viel einfacher und zuverlässiger, nur ein paar Themenprotokolle zu „berühren“, als Broker zu stoppen, Themenprotokolle zu löschen und bestimmte Zookeeper-Knoten zu löschen .

2
Andrew Carter

Der Rat von Thomas ist großartig, aber leider scheint zkCli in alten Versionen von Zookeeper (zum Beispiel 3.3.6) rmr nicht zu unterstützen. Vergleichen Sie beispielsweise die Befehlszeilenimplementierung in moderner Zookeeper mit Version 3. .

Wenn Sie mit einer alten Version von Zookeeper konfrontiert sind, besteht eine Lösung darin, eine Client-Bibliothek wie zc.zk für Python zu verwenden. Für Leute, die nicht mit Python vertraut sind, müssen Sie es mit pip oder easy_install installieren. Starten Sie dann eine Python - Shell (python) und Sie können Folgendes tun:

import zc.zk
zk = zc.zk.ZooKeeper('localhost:2181')
zk.delete_recursive('brokers/MyTopic') 

oder auch

zk.delete_recursive('brokers')

wenn Sie alle Themen aus Kafka entfernen möchten.

2
Mark Butler

So bereinigen Sie alle Nachrichten eines bestimmten Themas mithilfe Ihrer Anwendungsgruppe (GroupName sollte mit application kafka group name) identisch sein).

./kafka-path/bin/kafka-console-consumer.sh --zookeeper localhost:2181 --topic topicName --from-beginning --group application-group

2
user4713340
./kafka-topics.sh --describe --zookeeper zkHost:2181 --topic myTopic

Dies sollte retention.ms konfiguriert. Dann können Sie den obigen Befehl alter verwenden, um auf 1 Sekunde zu wechseln (und später auf die Standardeinstellung zurückzukehren).

Topic:myTopic   PartitionCount:6        ReplicationFactor:1     Configs:retention.ms=86400000
1
tushararora19

Aufgrund der Größe konnte kein Kommentar hinzugefügt werden: Ich bin mir nicht sicher, ob dies zutrifft, außer dass die Datei retention.ms und retention.bytes aktualisiert werden. Ich habe jedoch festgestellt, dass die Richtlinie für die Themenbereinigung "delete" (Standard) lauten sollte Halten Sie Nachrichten länger fest, dh wenn es "kompakt" ist, müssen Sie auch delete.retention.ms angeben.

./bin/kafka-configs.sh --zookeeper localhost:2181 --describe --entity-name test-topic-3-100 --entity-type topics
Configs for topics:test-topic-3-100 are retention.ms=1000,delete.retention.ms=10000,cleanup.policy=delete,retention.bytes=1

Auch musste frühestmögliche/späteste Offsets gleich überwacht werden, um zu bestätigen, dass dies erfolgreich geschah, kann auch das du -h/tmp/kafka-logs/test-topic-3-100- * überprüfen

./bin/kafka-run-class.sh kafka.tools.GetOffsetShell --broker-list "BROKER:9095" --topic test-topic-3-100 --time -1 | awk -F ":" '{sum += $3} END {print sum}' 26599762

./bin/kafka-run-class.sh kafka.tools.GetOffsetShell --broker-list "BROKER:9095" --topic test-topic-3-100 --time -2 | awk -F ":" '{sum += $3} END {print sum}' 26599762

Das andere Problem ist, dass Sie zuerst die aktuelle Konfiguration abrufen müssen , damit Sie sich daran erinnern, nach erfolgreichem Löschen zurückzusetzen: ./bin/kafka-configs.sh --zookeeper localhost:2181 --describe --entity-name test-topic-3-100 --entity-type topics

1
kisna

Ein anderer, eher manueller Ansatz zum Löschen eines Themas ist:

bei den Brokern:

  1. Stop kafka Broker
    Sudo service kafka stop
  2. Alle Partitionsprotokolldateien löschen (sollte auf allen Brokern durchgeführt werden)
    Sudo rm -R /kafka-storage/kafka-logs/<some_topic_name>-*

im Tierpfleger:

  1. Führen Sie die Befehlszeilenschnittstelle von zookeeper aus
    Sudo /usr/lib/zookeeper/bin/zkCli.sh
  2. Verwenden Sie zkCli, um die Themenmetadaten zu entfernen
    rmr /brokers/topic/<some_topic_name>

wieder bei den Brokern:

  1. Starten Sie den Brokerdienst neu
    Sudo service kafka start
1
Danny Mor

Verwenden Sie in Java das neue AdminZkClient anstelle des veralteten AdminUtils:

  public void reset() {
    try (KafkaZkClient zkClient = KafkaZkClient.apply("localhost:2181", false, 200_000,
        5000, 10, Time.SYSTEM, "metricGroup", "metricType")) {

      for (Map.Entry<String, List<PartitionInfo>> entry : listTopics().entrySet()) {
        deleteTopic(entry.getKey(), zkClient);
      }
    }
  }

  private void deleteTopic(String topic, KafkaZkClient zkClient) {

    // skip Kafka internal topic
    if (topic.startsWith("__")) {
      return;
    }

    System.out.println("Resetting Topic: " + topic);
    AdminZkClient adminZkClient = new AdminZkClient(zkClient);
    adminZkClient.deleteTopic(topic);

    // deletions are not instantaneous
    boolean success = false;
    int maxMs = 5_000;
    while (maxMs > 0 && !success) {
      try {
        maxMs -= 100;
        adminZkClient.createTopic(topic, 1, 1, new Properties(), null);
        success = true;
      } catch (TopicExistsException ignored) {
      }
    }

    if (!success) {
      Assert.fail("failed to create " + topic);
    }
  }

  private Map<String, List<PartitionInfo>> listTopics() {
    Properties props = new Properties();
    props.put("bootstrap.servers", kafkaContainer.getBootstrapServers());
    props.put("group.id", "test-container-consumer-group");
    props.put("key.deserializer", "org.Apache.kafka.common.serialization.StringDeserializer");
    props.put("value.deserializer", "org.Apache.kafka.common.serialization.StringDeserializer");

    KafkaConsumer<String, String> consumer = new KafkaConsumer<>(props);
    Map<String, List<PartitionInfo>> topics = consumer.listTopics();
    consumer.close();

    return topics;
  }
1

Nach der Antwort von @steven appleyard führte ich die folgenden Befehle auf Kafka 2.2.0 aus und sie arbeiteten für mich.

bin/kafka-configs.sh --zookeeper localhost:2181 --entity-type topics --entity-name <topic-name> --describe

bin/kafka-configs.sh --zookeeper localhost:2181 --entity-type topics --entity-name <topic-name> --alter --add-config retention.ms=1000

bin/kafka-configs.sh --zookeeper localhost:2181 --entity-type topics --entity-name <topic-name> --alter --delete-config retention.ms
1
abbas