web-dev-qa-db-ja.com

パージカフカトピック

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

kafka.common.InvalidMessageSizeException: invalid message size

ここではfetch.sizeを大きくするのは理想的ではありません。私は実際にはそれほど大きなメッセージを受け入れたくないからです。カフカのトピックを削除する方法はありますか?

141
Peter Klipfel

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

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

そして、より新しいKafkaリリースでは、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値を復元します。

324

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

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
48
rjaiswal

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でテスト済み。

46
Thomas Bratt

受け入れられた答えが正しい間、その方法は非難されました。トピックの設定は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
40
Shane Perry

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

delete.topic.enable=true

その後、このコマンドを実行することができます:

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

Kafka 1.1から

トピックを削除する

bin/kafka-configs.sh - zookeeper localhost:2181 --alter --entity-type topics - > - エンティティ名tp_binance_kline --add-config retention.ms = 100

1分待って、そのトピックを削除して設定を削除した後、デフォルト値に移動します。

bin/kafka-configs.sh - zookeeper localhost:2181 --alter --entity-typeのトピック - > -entity-name tp_binance_kline --delete-config retention.ms

5
user644265

飽和したクラスタ(パーティションが多すぎる、暗号化されたトピックデータを使用する、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>

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

4
Ben Coughlan

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

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

4
Wildfire

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

最初に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
3
Manish Jaiswal

最も簡単な方法は、個々のログファイルの日付を保存期間よりも古い日付に設定することです。それからブローカーはそれらを片付け、あなたのために数秒以内にそれらを取り除くべきです。これにはいくつかの利点があります。

  1. ブローカーを停止させる必要はありません。ランタイム操作です。
  2. 無効なオフセット例外が発生する可能性を回避します(詳細は後述)。

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

これは、そのトピックに対するzookeeperの消費者オフセットもクリアすることで軽減できます。しかし、バージントピックを必要とせず、単に既存のコンテンツを削除したい場合は、ブローカーを停止し、トピックログを削除し、特定のzookeeperノードをクリアするよりも、単純にいくつかのトピックログを「触れる」ほうがはるかに簡単です。 。

2
Andrew Carter

Thomasのアドバイスは素晴らしいですが、残念ながらZookeeperの古いバージョン(例えば3.3.6)のzkClirmrをサポートしていないようです。たとえば、 modern Zookeeper のコマンドライン実装と version 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
Mark Butler

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

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

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

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

サイズのため、コメントとして追加できませんでした。これがtrueであるかどうかはわかりませんが、retention.msとretention.bytesの更新以外にも、トピックのクリーンアップポリシーは "delete"(デフォルト)である必要があります。より長くメッセージを保持する、つまり、それが「コンパクト」である場合は、 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
kisna

トピックを削除するためのもう1つの、むしろ手動のアプローチは、です。

ブローカー内の

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

zookeeperの

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

再びブローカーで

  1. ブローカーサービスを再起動します
    Sudo service kafka start
1
Danny Mor

@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
1
abbas

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