カフカのトピックを削除する方法はありますか?
大きすぎるメッセージをローカルマシンのkafkaメッセージトピックにプッシュすると、エラーが発生します。
kafka.common.InvalidMessageSizeException: invalid message size
を大きくすることfetch.size
はここでは理想的ではありません。私は実際にはそれほど大きなメッセージを受け入れたくないからです。
カフカのトピックを削除する方法はありますか?
大きすぎるメッセージをローカルマシンの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-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 --alter --topic MyTopic --deleteConfig retention.ms
--delete-config retention.ms
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>
キューを削除するには、トピックを削除します。
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
delete.topic.enable=true
ファイルconfig/server.properties
に行を追加することを忘れないでくださいNote: This will have no impact if delete.topic.enable is not set to true.
という名前のトピックを削除する手順は次の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でテスト済み。
./zookeeper-shell.sh localhost:2181
および./kafka-topics.sh --list --zookeeper localhost:2181
zookeeper-client
代わりに使用できますzkCli.sh
(Cloudera CDH5で試してみました)
受け入れられた答えは正しいですが、その方法は廃止されました。トピックの設定は、を介して行う必要があります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-configs --zookeeper localhost:2181 --entity-type topics --alter --delete-config retention.ms --entity-name MyTopic
カフカ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
bin/kafka-configs.sh --zookeeper localhost:2181 --alter --entity-type topics --entity-name my-topic --add-config rentention.ms=100
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
クラスターが飽和している場合(パーティションが多すぎる、暗号化されたトピックデータを使用している、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
必須ではありません
更新:この回答はKafka 0.6に関連しています。Kafka 0.8以降については、@ Patrickの回答を参照してください。
はい、kafkaを停止し、対応するサブディレクトリからすべてのファイルを手動で削除します(kafkaデータディレクトリで簡単に見つけることができます)。kafkaを再起動すると、トピックは空になります。
最も簡単な方法は、個々のログファイルの日付を保存期間よりも古いものに設定することです。次に、ブローカーはそれらをクリーンアップし、数秒以内に削除します。これにはいくつかの利点があります。
Kafka 0.7.xでの私の経験では、ログファイルを削除してブローカーを再起動すると、特定のコンシューマーに対して無効なオフセット例外が発生する可能性があります。これは、ブローカーが(既存のログファイルがない場合に)オフセットをゼロから再開し、以前にトピックから使用していたコンシューマーが再接続して特定の[有効な]オフセットを要求するために発生します。このオフセットがたまたま新しいトピックログの範囲外にある場合、害はなく、コンシューマは最初または最後のいずれかから再開します。ただし、オフセットが新しいトピックログの範囲内にある場合、ブローカーはメッセージセットをフェッチしようとしますが、オフセットが実際のメッセージに一致しないため失敗します。
これは、そのトピックの飼育係の消費者オフセットもクリアすることで軽減できます。しかし、新しいトピックが不要で、既存のコンテンツを削除したいだけの場合は、ブローカーを停止してトピックログを削除し、特定の動物園のノードをクリアするよりも、いくつかのトピックログを「タッチ」する方がはるかに簡単で信頼性があります。 。
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からすべてのトピックを削除する場合。
アプリケーショングループを使用して、特定のトピックからのすべてのメッセージをクリーンアップするには(GroupNameはアプリケーションのkafkaグループ名と同じである必要があります)。
./kafka-path/bin/kafka-console-consumer.sh --zookeeper localhost:2181 --topic topicName --from-beginning --group application-group
@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
ここにはたくさんの素晴らしい答えがありますが、そのうち、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
you can use
--zookeeper zookeeper:2181`は、Kafkaコンテナーからのポイントです。または、server.propertiesファイルからZookeeper行をgrepで出力する
サイズが原因でコメントとして追加できませんでした:これが当てはまるかどうかわからないのですが、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つの手動のアプローチは次のとおりです。
ブローカーで:
sudo service kafka stop
sudo rm -R /kafka-storage/kafka-logs/<some_topic_name>-*
飼育係で:
sudo /usr/lib/zookeeper/bin/zkCli.sh
rmr /brokers/topic/<some_topic_name>
ブローカーで再び:
sudo service kafka start
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;
}
AdminClient
またはKafkaAdminClient