답변:
주제의 보존 시간을 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 --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
kafka 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 사용 경험에서 로그 파일을 제거하고 브로커를 다시 시작하면 특정 소비자에 대해 잘못된 오프셋 예외가 발생할 수 있습니다. 브로커가 기존 로그 파일이없는 상태에서 오프셋을 0으로 다시 시작하고 주제에서 이전에 소비 한 소비자가 특정 [한 번만 유효한] 오프셋을 요청하기 위해 다시 연결하기 때문에 이러한 상황이 발생합니다. 이 오프셋이 새 토픽 로그의 범위를 벗어나면 피해가없고 소비자는 처음이나 끝에서 다시 시작됩니다. 그러나 오프셋이 새 토픽 로그의 범위 내에 들어가면 브로커가 메시지 세트를 가져 오려고 시도하지만 오프셋이 실제 메시지와 정렬되지 않으므로 실패합니다.
또한 해당 주제에 대한 동물원 직원의 소비자 오프셋을 지우면이를 완화 할 수 있습니다. 그러나 처녀 주제가 필요하지 않고 기존 내용을 제거하려는 경우 브로커 중지, 주제 로그 삭제 및 특정 사육사 노드 지우기보다 몇 가지 주제 로그를 '터치'하는 것이 훨씬 쉽고 안정적입니다. .
Thomas의 조언은 훌륭하지만 불행히도 zkCli
이전 버전의 Zookeeper (예 : 3.3.6)에서는 지원하지 않는 것 같습니다 rmr
. 예를 들어 최신 Zookeeper 의 명령 행 구현 을 버전 3.3 과 비교하십시오 .
이전 버전의 Zookeeper에 직면 한 경우 한 가지 해결책은 Python에 zc.zk 와 같은 클라이언트 라이브러리를 사용하는 것 입니다. 파이썬에 익숙하지 않은 사람들은 pip 또는 easy_install을 사용하여 설치해야합니다 . 그런 다음 파이썬 쉘 ( 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
여기에 많은 훌륭한 답변이 있지만 그중에서도 도커에 대한 정보를 찾지 못했습니다. 나는이 경우 브로커 컨테이너 사용이 잘못되었다는 것을 알기 위해 약간의 시간을 보냈습니다.
## 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
-카프카 컨테이너의 동물원 키퍼 동물원 키퍼 : 2181 심지어 server.properties 파일에서 사육사 라인을 grep을
크기 때문에 주석으로 추가 할 수 없음 : retention.ms 및 retention.bytes 업데이트 외에 이것이 사실인지 확실하지 않지만 "compact"인 경우 주제 정리 정책이 "delete"(기본값) 여야한다는 것을 알았습니다. 메시지를 더 길게 붙입니다 (예 : "compact"인 경우) . 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
다른 문제는 현재 구성을 먼저 얻어야 삭제가 성공한 후 되돌릴 수 있다는 것입니다.
./bin/kafka-configs.sh --zookeeper localhost:2181 --describe --entity-name test-topic-3-100 --entity-type topics
주제를 제거하는 다른 수동 방법은 다음과 같습니다.
브로커에서 :
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
./kafka-topics.sh --describe --zookeeper zkHost:2181 --topic myTopic
이것은 retention.ms
구성 되어야 합니다. 그런 다음 위의 alter 명령을 사용하여 1 초로 변경 한 다음 나중에 기본값으로 되돌릴 수 있습니다.
Topic:myTopic PartitionCount:6 ReplicationFactor:1 Configs:retention.ms=86400000
AdminZkClient
더 이상 사용되지 않는 대신 new 를 사용하여 Java에서 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