カフカトピックの削除


185

カフカのトピックを削除する方法はありますか?

大きすぎるメッセージをローカルマシンのkafkaメッセージトピックにプッシュすると、エラーが発生します。

kafka.common.InvalidMessageSizeException: invalid message size

を大きくすることfetch.sizeはここでは理想的ではありません。私は実際にはそれほど大きなメッセージを受け入れたくないからです。

回答:


360

トピックの保持時間を一時的に1秒に更新します。

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

そして、新しいカフカリリースでは、 kafka-configs --entity-type topics

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

次に、パージが有効になるのを待ちます(約1分)。削除したら、以前のretention.ms値を復元します。


8
これはすばらしい回答ですが、トピックの現在の保持期間.ms値の確認から始める方法の説明を追加していただけませんか?
Greg Dubicki

28
私は、現在の設定をチェックについてはわからないが、私はバックのようなデフォルトのルックスにそれをリセットすると信じて:bin/kafka-topics.sh --zookeeper localhost:2181 --alter --topic MyTopic --deleteConfig retention.ms
ニホンコウジカビ

15
またはバージョンに応じて:--delete-config retention.ms
aspergillusOryzae 2015年

3
ただのfyiで、kafka v。0.9.0.0の場合は、ubuntu @ ip-172-31-21-201:/opt/kafka/kafka_2.10-0.9.0.0-SNAPSHOT$ bin / kafka-topics.sh- -zookeeper localhost:2181 --alter --topic room-data --configtention.ms = 1000警告:このスクリプトからのトピック構成の変更は非推奨になり、将来のリリースで削除される可能性があります。今後、この機能にはkafka-configs.shを使用してください
Alper Akture

54
0.9.0以降、kafka-topics.shを使用して構成を変更することは推奨されなくなりました。新しいオプションは、kafka-configs.shスクリプトを使用することです。 e.g. kafka-configs.sh --zookeeper <zkhost>:2181 --alter --entity-type topics --entity-name <topic name> --add-config retention.ms=1000 これにより、現在の保持期間を確認することもできます。例:kafka-configs --zookeeper <zkhost>:2181 --describe --entity-type topics --entity-name <topic name>
RHE

70

キューを削除するには、トピックを削除します。

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

次に、それを再作成します。

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

14
上記のコマンドで出力される警告にあるように、delete.topic.enable=trueファイルconfig/server.propertiesに行を追加することを忘れないでくださいNote: This will have no impact if delete.topic.enable is not set to true.
Patrizio Bertoni

3
これは常に瞬時であるとは限りません。時々それは単に削除のマークを付け、実際の削除は後で起こります。
Gaurav Khare

48

という名前のトピックを削除する手順は次のMyTopicとおりです。

  1. トピックを説明し、ブローカーIDは使わない
  2. リストされているブローカーIDごとにApache Kafkaデーモンを停止します。
  3. 各ブローカーに接続し、トピックデータフォルダー(例:)を削除しますrm -rf /tmp/kafka-logs/MyTopic-0。他のパーティションとすべてのレプリカについて繰り返します
  4. 話題のメタデータを削除します。zkCli.shその後、rmr /brokers/MyTopic
  5. 停止したマシンごとにApache Kafkaデーモンを起動します

ステップ3を見逃した場合、Apache Kafkaは引き続きトピックを報告し続けます(たとえば、を実行した場合kafka-list-topic.sh)。

Apache Kafka 0.8.0でテスト済み。


2
0.8.1 ./zookeeper-shell.sh localhost:2181および./kafka-topics.sh --list --zookeeper localhost:2181
pdeschen 2014年

zookeeper-client代わりに使用できますzkCli.sh(Cloudera CDH5で試してみました)
Martin

1
これにより、トピック内のデータではなく、トピックが削除されます。これには、ブローカーを停止する必要があります。これはせいぜいハックです。スティーブン・アップルヤードの答えは本当に最高です。
ジェフマース

1
これが書かれた当時はこれが唯一の方法でした。
Thomas Bratt

2
飼育係のトピスは/ brokers / topics / <ここでのトピック名>の下にありましたが、Kafka 0.8.2.1で私のために働きました
codecraig

44

受け入れられた答えは正しいですが、その方法は廃止されました。トピックの設定は、を介して行う必要がありますkafka-configs

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

この方法で設定された構成は、次のコマンドで表示できます

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

2
追加する価値もありますkafka-configs --zookeeper localhost:2181 --entity-type topics --alter --delete-config retention.ms --entity-name MyTopic
。– NoBrainer

38

クイックスタートの例として、Kafka 0.8.2でテスト:最初に、configフォルダーの下のserver.propertiesファイルに1行追加します。

delete.topic.enable=true

その後、次のコマンドを実行できます。

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

6

カフカ1.1から

トピックを削除する

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

1分待って、kafkaがトピックを完全に消去するようにして、構成を削除してから、デフォルト値に進みます。

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

1
余分な矢があると思います。私は走ることができましたbin/kafka-configs.sh --zookeeper localhost:2181 --alter --entity-type topics --entity-name my-topic --add-config rentention.ms=100
Will

4

kafkaには、トピック(キュー)をパージ/クリーンアップする直接的な方法はありませんが、そのトピックを削除して再作成することでこれを行うことができます。

最初にsever.propertiesファイルが存在することを確認し、存在しない場合は追加します delete.topic.enable=true

次に、トピックを削除します bin/kafka-topics.sh --zookeeper localhost:2181 --delete --topic myTopic

その後、再度作成してください。

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

4

クラスターが飽和している場合(パーティションが多すぎる、暗号化されたトピックデータを使用している、SSLを使用している、コントローラーが不良ノード上にある、または接続が不安定である場合) 。

特にAvroを使用している場合は、次の手順に従います。

1:kafkaツールで実行:

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

2:スキーマレジストリノードで実行します。

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:トピックが空になったら、トピックの保持を元の設定に戻します。

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

簡単には宣伝できないので、これが誰かの役に立つことを願っています。


注:kafka-avro-console-consumer必須ではありません
OneCricketeer

4

更新:この回答はKafka 0.6に関連しています。Kafka 0.8以降については、@ Patrickの回答を参照してください。

はい、kafkaを停止し、対応するサブディレクトリからすべてのファイルを手動で削除します(kafkaデータディレクトリで簡単に見つけることができます)。kafkaを再起動すると、トピックは空になります。


これはブローカーをダウンさせる必要があり、せいぜいハックです。スティーブン・アップルヤードの答えは本当に最高です。
ジェフマース

@MaasSql同意する。:)この答えはバージョン0.6について2年前のものです。「トピックの変更」および「トピックの削除」機能は後で実装されました。
Wildfire

スティーブン・アップルヤードの答えはこれと同じくらいハックです。
Banjocat 2016年

アプリケーションが独自のデータをサポートされている方法で削除する処理を行うことは、そのアプリケーションをオフにして、すべてのデータファイルであると思われるものを削除してから再びオンにするよりもはるかに簡単です。
Nick

3

最も簡単な方法は、個々のログファイルの日付を保存期間よりも古いものに設定することです。次に、ブローカーはそれらをクリーンアップし、数秒以内に削除します。これにはいくつかの利点があります。

  1. ブローカーを停止する必要はありません。これはランタイム操作です。
  2. 無効なオフセット例外の可能性を回避します(詳細は以下を参照)。

Kafka 0.7.xでの私の経験では、ログファイルを削除してブローカーを再起動すると、特定のコンシューマーに対して無効なオフセット例外が発生する可能性があります。これは、ブローカーが(既存のログファイルがない場合に)オフセットをゼロから再開し、以前にトピックから使用していたコンシューマーが再接続して特定の[有効な]オフセットを要求するために発生します。このオフセットがたまたま新しいトピックログの範囲外にある場合、害はなく、コンシューマは最初または最後のいずれかから再開します。ただし、オフセットが新しいトピックログの範囲内にある場合、ブローカーはメッセージセットをフェッチしようとしますが、オフセットが実際のメッセージに一致しないため失敗します。

これは、そのトピックの飼育係の消費者オフセットもクリアすることで軽減できます。しかし、新しいトピックが不要で、既存のコンテンツを削除したいだけの場合は、ブローカーを停止してトピックログを削除し、特定の動物園のノードをクリアするよりも、いくつかのトピックログを「タッチ」する方がはるかに簡単で信頼性があります。 。


「個々のログファイルの日付を保存期間よりも前に設定する」方法 ありがとう
bylijinnan 2016年

3

Thomasのアドバイスは素晴らしいですが、残念ながらzkCli古いバージョンのZookeeper(たとえば3.3.6)ではサポートされないようですrmr。たとえば、最新のZookeeperのコマンドライン実装をバージョン3.3と比較します。

古いバージョンのZookeeperに直面している場合の解決策の1つは、Pythonのzc.zkなどのクライアントライブラリを使用することです。Pythonに慣れていない人は、pipまたはeasy_installを使用してインストールする必要があります。次に、Pythonシェル(python)を起動すると、次のことができます。

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

あるいは

zk.delete_recursive('brokers')

Kafkaからすべてのトピックを削除する場合。


2

アプリケーショングループを使用して、特定のトピックからのすべてのメッセージをクリーンアップするには(GroupNameはアプリケーションのkafkaグループ名と同じである必要があります)。

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


このアプローチには問題があります(0.8.1.1でテスト済み)。アプリケーションが2つ(またはそれ以上)のトピック(topic1とtopic2)にサブスクライブし、コンソールコンシューマーがtopic1をクリーンアップする場合、残念ながら、トピック2の無関係なコンシューマーオフセットも削除され、topic2からすべてのメッセージが再生されます。
jsh 2015

2

@steven appleyardの回答に続いて、Kafka 2.2.0で次のコマンドを実行しました。

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

これは他の回答と重複しているようです
OneCricketeer

2

ここにはたくさんの素晴らしい答えがありますが、そのうち、Dockerについては答えが見つかりませんでした。ブローカーコンテナーの使用がこのケースでは間違っていることを理解するのに少し時間を費やしました(明らかに!!!)

## this is wrong!
docker exec broker1 kafka-topics --zookeeper localhost:2181 --alter --topic mytopic --config retention.ms=1000
Exception in thread "main" kafka.zookeeper.ZooKeeperClientTimeoutException: Timed out waiting for connection while in state: CONNECTING
        at kafka.zookeeper.ZooKeeperClient.$anonfun$waitUntilConnected$3(ZooKeeperClient.scala:258)
        at scala.runtime.java8.JFunction0$mcV$sp.apply(JFunction0$mcV$sp.java:23)
        at kafka.utils.CoreUtils$.inLock(CoreUtils.scala:253)
        at kafka.zookeeper.ZooKeeperClient.waitUntilConnected(ZooKeeperClient.scala:254)
        at kafka.zookeeper.ZooKeeperClient.<init>(ZooKeeperClient.scala:112)
        at kafka.zk.KafkaZkClient$.apply(KafkaZkClient.scala:1826)
        at kafka.admin.TopicCommand$ZookeeperTopicService$.apply(TopicCommand.scala:280)
        at kafka.admin.TopicCommand$.main(TopicCommand.scala:53)
        at kafka.admin.TopicCommand.main(TopicCommand.scala)

と私は私の構成ファイルのzookeeper:2181代わりに使用する必要があり--zookeeper localhost:2181ました

## this might be an option, but as per comment below not all zookeeper images can have this script included
docker exec zookeper1 kafka-topics --zookeeper localhost:2181 --alter --topic mytopic --config retention.ms=1000

正しいコマンドは

docker exec broker1 kafka-configs --zookeeper zookeeper:2181 --alter --entity-type topics --entity-name dev_gdn_urls --add-config retention.ms=12800000

それが誰かの時間を節約することを願っています。

また、メッセージはすぐには削除されず、ログのセグメントが閉じられるときに発生することにも注意してください。


ブローカーに問題なく実行できます。問題はlocalhost:2181...例:Dockerのネットワーク機能を誤解しています。さらに、すべてのZookeeperコンテナーにがあるkafka-topicsわけではないため、そのように使用しないことをお勧めします。最新のカフカのインストールでは、--bootstrap-servers代わりにトピックを変更できます--zookeeper
OneCricketeer

1
それでも、Zookeeperコンテナーへのexecは間違っているようです。you can use --zookeeper zookeeper:2181`は、Kafkaコンテナーからのポイントです。または、server.propertiesファイルからZookeeper行をgrepで出力する
OneCricketeer

@ cricket_007こんにちは、本当にありがとう、私は答えを修正しました、まだそこに何か問題がある場合はお知らせください
Vladimir Semashkin

1

サイズが原因でコメントとして追加できませんでした:これが当てはまるかどうかわからないのですが、retention.msとtention.bytesを更新しますが、トピックのクリーンアップポリシーは「削除」(デフォルト)である必要があることに気付きました。メッセージを長く保持する、つまり「コンパクト」の場合は、delete.retention.msも指定する必要があります。

./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

また、これが正常に行われたことを確認するために、最初/最新のオフセットが同じであることを監視する必要があり、du -h / tmp / kafka-logs / test-topic-3-100- *も確認できます

./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

もう1つの問題は、現在の構成を最初に取得する必要があるため、削除が成功した後、必ず元に戻すことです。 ./bin/kafka-configs.sh --zookeeper localhost:2181 --describe --entity-name test-topic-3-100 --entity-type topics


1

トピックをパージするためのもう1つの手動のアプローチは次のとおりです。

ブローカーで:

  1. カフカブローカーを停止
    sudo service kafka stop
  2. すべてのパーティションログファイルを削除します(すべてのブローカーで実行する必要があります)
    sudo rm -R /kafka-storage/kafka-logs/<some_topic_name>-*

飼育係で:

  1. zookeeperコマンドラインインターフェースを実行する
    sudo /usr/lib/zookeeper/bin/zkCli.sh
  2. zkCliを使用してトピックのメタデータを削除する
    rmr /brokers/topic/<some_topic_name>

ブローカーで再び:

  1. ブローカーサービスを再起動する
    sudo service kafka start

レプリカを使用して各ブローカーからファイルを停止して削除する必要があります。つまり、これを行うとクライアントのダウンタイムが発生する可能性があります
OneCricketeer

1
正解です。これにより、Kafkaが保管および管理しているものがどこにあるかを実際に確認できます。しかし、このブルートフォースアプローチは、本番稼働システム用ではありません。
ダニーMor

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

これでretention.ms設定が完了するはずです。次に、上記のalterコマンドを使用して、1秒に変更できます(後でデフォルトに戻すことができます)。

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

1

JavaからAdminZkClient、非推奨の代わりに新しいを使用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;
  }

Zookeeperは必要ありません。使用AdminClientまたはKafkaAdminClient
OneCricketeer
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.