카프카 토픽 제거


185

kafka에서 주제를 제거하는 방법이 있습니까?

로컬 컴퓨터의 kafka 메시지 주제로 너무 큰 메시지를 푸시했는데 오류가 발생했습니다.

kafka.common.InvalidMessageSizeException: invalid message size

fetch.size실제로는 큰 메시지를 수락하고 싶지 않기 때문에 여기서 증가시키는 것은 이상적이지 않습니다.

답변:


359

주제의 보존 시간을 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값을 복원하십시오 .


8
좋은 답변이지만 주제의 현재 retention.ms 값을 확인하는 방법에 대한 설명을 추가 할 수 있습니까?
Greg Dubicki

28
현재 구성을 확인하는 것이 확실하지 않지만 기본 구성으로 다시 재설정하는 방법은 다음과 같습니다.bin/kafka-topics.sh --zookeeper localhost:2181 --alter --topic MyTopic --deleteConfig retention.ms
aspergillusOryzae

15
또는 버전에 따라 :--delete-config retention.ms
누룩 곰팡이

3
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 --config retention.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.propertiesNote: 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

zookeeper-client대신 사용할 수 있음 zkCli.sh(Cloudera CDH5에서 시도)
Martin Tapp

1
그러면 내부 데이터가 아닌 주제가 삭제됩니다. 이를 위해서는 브로커를 중지해야합니다. 이것은 최선의 해킹입니다. Steven Appleyard의 대답은 실제로 절대 최고입니다.
Jeff Maass

1
이것이 쓰여질 당시의 유일한 방법이었습니다.
토마스 브라 트

2
동물원 사육장의 탑은 / brokers / topics / <topic name here> 아래에 있지만 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 파일에 한 줄을 추가하십시오.

delete.topic.enable=true

그런 다음이 명령을 실행할 수 있습니다.

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

6

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

1
여분의 화살표가 있다고 생각합니다. 내에서, 나는 달릴 수 있었다bin/kafka-configs.sh --zookeeper localhost:2181 --alter --entity-type topics --entity-name my-topic --add-config rentention.ms=100

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를 다시 시작하면 주제가 비어 있습니다.


이를 위해서는 브로커를 중단시켜야하며, 적어도 해킹입니다. Steven Appleyard의 대답은 실제로 절대 최고입니다.
Jeff Maass

@MaasSql 동의합니다. :)이 답변은 버전 0.6에 관한 2 살입니다. "주제 변경"및 "주제 삭제"기능은 나중에 구현되었습니다.
Wildfire

Steven Appleyard의 답변은 이것만큼 해키입니다.
Banjocat

지원되는 방식으로 자체 데이터를 삭제하는 애플리케이션 핸들을 갖는 것은 해당 애플리케이션을 끄고 모든 데이터 파일이라고 생각한 것을 삭제 한 다음 다시 켜는 것보다 훨씬 덜 해킹됩니다.
Nick

3

가장 간단한 방법은 개별 로그 파일의 날짜를 보존 기간보다 오래 설정하는 것입니다. 그런 다음 브로커가이를 정리하고 몇 초 내에 제거해야합니다. 이것은 몇 가지 장점을 제공합니다.

  1. 브로커를 중단 할 필요가 없습니다. 런타임 작업입니다.
  2. 유효하지 않은 오프셋 예외가 발생하지 않도록합니다 (아래에 자세히 설명).

Kafka 0.7.x 사용 경험에서 로그 파일을 제거하고 브로커를 다시 시작하면 특정 소비자에 대해 잘못된 오프셋 예외가 발생할 수 있습니다. 브로커가 기존 로그 파일이없는 상태에서 오프셋을 0으로 다시 시작하고 주제에서 이전에 소비 한 소비자가 특정 [한 번만 유효한] 오프셋을 요청하기 위해 다시 연결하기 때문에 이러한 상황이 발생합니다. 이 오프셋이 새 토픽 로그의 범위를 벗어나면 피해가없고 소비자는 처음이나 끝에서 다시 시작됩니다. 그러나 오프셋이 새 토픽 로그의 범위 내에 들어가면 브로커가 메시지 세트를 가져 오려고 시도하지만 오프셋이 실제 메시지와 정렬되지 않으므로 실패합니다.

또한 해당 주제에 대한 동물원 직원의 소비자 오프셋을 지우면이를 완화 할 수 있습니다. 그러나 처녀 주제가 필요하지 않고 기존 내용을 제거하려는 경우 브로커 중지, 주제 로그 삭제 및 특정 사육사 노드 지우기보다 몇 가지 주제 로그를 '터치'하는 것이 훨씬 쉽고 안정적입니다. .


"개별 로그 파일의 날짜를 보존 기간보다 오래 설정하는 방법"은 무엇입니까? 감사합니다
bylijinnan 2016 년

3

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에서 모든 주제를 제거하려면


2

응용 프로그램 그룹 (GroupName은 응용 프로그램 kafka 그룹 이름과 동일해야 함)을 사용하여 특정 주제의 모든 메시지를 정리합니다.

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


이 접근 방식에 문제가 있습니다 (0.8.1.1에서 테스트 됨). 애플리케이션이 topic1 및 topic2의 두 개 이상의 주제를 구독하고 콘솔 소비자가 topic1을 정리하는 경우 불행히도 topic2에 대한 관련되지 않은 소비자 오프셋도 삭제하여 topic2의 모든 메시지가 재생됩니다.
jsh

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

여기에 많은 훌륭한 답변이 있지만 그중에서도 도커에 대한 정보를 찾지 못했습니다. 나는이 경우 브로커 컨테이너 사용이 잘못되었다는 것을 알기 위해 약간의 시간을 보냈습니다.

## 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

누군가의 시간을 절약 할 수 있기를 바랍니다.

또한 메시지는 즉시 삭제되지 않으며 로그 세그먼트가 닫힐 때 발생합니다.


브로커에 exec를 실행할 수 있습니다. 문제는 localhost:2181... 예를 들어 Docker 네트워킹 기능을 잘못 이해하고 있습니다. 또한 모든 Zookeeper 컨테이너에가있는 kafka-topics것은 아니므로 그렇게 사용하지 않는 것이 가장 좋습니다. 에 대한 최신 카프카의 설치를 허용 --bootstrap-servers하는 대신 항목을 변경--zookeeper
OneCricketeer

1
여전히 Zookeeper 컨테이너에 대한 실행이 잘못된 것 같습니다. you can use -카프카 컨테이너의 동물원 키퍼 동물원 키퍼 : 2181 심지어 server.properties 파일에서 사육사 라인을 grep을
OneCricketeer

@ cricket_007 이봐, 정말 고마워, 난 대답을 수정, 거기에 뭔가 잘못 여전히 알려주세요
Vladimir Semashkin

1

크기 때문에 주석으로 추가 할 수 없음 : 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


1

주제를 제거하는 다른 수동 방법은 다음과 같습니다.

브로커에서 :

  1. 카프카 브로커 중지
    sudo service kafka stop
  2. 모든 파티션 로그 파일 삭제 (모든 브로커에서 수행해야 함)
    sudo rm -R /kafka-storage/kafka-logs/<some_topic_name>-*

사육사에서 :

  1. 사육사 명령 행 인터페이스 실행
    sudo /usr/lib/zookeeper/bin/zkCli.sh
  2. zkCli를 사용하여 주제 메타 데이터 제거
    rmr /brokers/topic/<some_topic_name>

브로커에서 다시 :

  1. 브로커 서비스 재시작
    sudo service kafka start

복제본을 사용하여 각 브로커에서 파일을 중지하고 제거해야합니다. 이렇게하면 클라이언트 다운 타임이 발생할 수 있습니다.
OneCricketeer

1
당신은 정확합니다. 이것은 Kafka가 저장하고 관리하는 곳을 실제로 보여줍니다. 그러나이 무차별 접근 방식은 프로덕션 운영 시스템에는 적합하지 않습니다.
Danny 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

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

Zookeeper가 필요하지 않습니다. 사용 AdminClient또는KafkaAdminClient
OneCricketeer
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.