大きすぎるメッセージをローカルマシンのkafkaメッセージトピックにプッシュしましたが、エラーになりました。
kafka.common.InvalidMessageSizeException: invalid message size
ここではfetch.size
を大きくするのは理想的ではありません。私は実際にはそれほど大きなメッセージを受け入れたくないからです。カフカのトピックを削除する方法はありますか?
トピックの保存期間を一時的に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
値を復元します。
キューを削除するには、トピックを削除します。
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
MyTopic
という名前のトピックを削除する手順は次のとおりです。
rm -rf /tmp/kafka-logs/MyTopic-0
。他のパーティションとすべてのレプリカについて繰り返しますzkCli.sh
、次にrmr /brokers/MyTopic
あなたがあなたがいなくて寂しいならステップ3、そしてApache Kafkaは現在のようにトピックを報告し続けるでしょう(例えばあなたがkafka-list-topic.sh
を実行する場合)。
Apache Kafka 0.8.0でテスト済み。
受け入れられた答えが正しい間、その方法は非難されました。トピックの設定は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
クイックスタートの例として、Kafka 0.8.2でテストしました。まず、configフォルダーの下のserver.propertiesファイルに1行追加します。
delete.topic.enable=true
その後、このコマンドを実行することができます:
bin/kafka-topics.sh --zookeeper localhost:2181 --delete --topic test
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
飽和したクラスタ(パーティションが多すぎる、暗号化されたトピックデータを使用する、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 0.6に関連しています。 Kafka 0.8以降については、@ Patrickによる回答を参照してください。
はい、kafkaを停止し、対応するサブディレクトリからすべてのファイルを手動で削除します(kafkaのdataディレクトリにあるのが簡単です)。 kafkaの再起動後、トピックは空になります。
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
最も簡単な方法は、個々のログファイルの日付を保存期間よりも古い日付に設定することです。それからブローカーはそれらを片付け、あなたのために数秒以内にそれらを取り除くべきです。これにはいくつかの利点があります。
Kafka 0.7.xでの私の経験では、ログファイルを削除してブローカーを再起動すると、特定のコンシューマーにとって無効なオフセット例外が発生する可能性があります。これは、既存のログファイルがない場合にブローカがオフセットをゼロから再開し、以前トピックから消費していたコンシューマが特定の[一度有効]オフセットを要求するために再接続するために発生します。このオフセットが新しいトピックログの範囲外になっても、害はなく、コンシューマは最初または最後から再開します。ただし、オフセットが新しいトピックログの範囲内に収まると、ブローカはメッセージセットを取得しようとしますが、オフセットが実際のメッセージと一致しないため失敗します。
これは、そのトピックに対するzookeeperの消費者オフセットもクリアすることで軽減できます。しかし、バージントピックを必要とせず、単に既存のコンテンツを削除したい場合は、ブローカーを停止し、トピックログを削除し、特定のzookeeperノードをクリアするよりも、単純にいくつかのトピックログを「触れる」ほうがはるかに簡単です。 。
Thomasのアドバイスは素晴らしいですが、残念ながらZookeeperの古いバージョン(例えば3.3.6)のzkCli
はrmr
をサポートしていないようです。たとえば、 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からすべてのトピックを削除したい場合。
アプリケーショングループを使用して特定のトピックからすべてのメッセージをクリーンアップするには(GroupNameはapplication kafkaグループ名と同じである必要があります)。
./kafka-path/bin/kafka-console-consumer.sh --zookeeper localhost:2181 --topic topicName --from-beginning --group application-group
./kafka-topics.sh --describe --zookeeper zkHost:2181 --topic myTopic
これによりretention.ms
が設定されます。その後、上記のalterコマンドを使用して1秒に変更することができます(後でデフォルトに戻ります)。
Topic:myTopic PartitionCount:6 ReplicationFactor:1 Configs:retention.ms=86400000
サイズのため、コメントとして追加できませんでした。これが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つの、むしろ手動のアプローチは、です。
ブローカー内の:
Sudo service kafka stop
Sudo rm -R /kafka-storage/kafka-logs/<some_topic_name>-*
zookeeperの:
Sudo /usr/lib/zookeeper/bin/zkCli.sh
rmr /brokers/topic/<some_topic_name>
再びブローカーで:
Sudo service kafka start
@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
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;
}