실행하기 전에 토픽에서 모든 데이터를 삭제하거나 토픽을 삭제하는 방법이 있습니까?


89

실행하기 전에 토픽에서 모든 데이터를 삭제하거나 토픽을 삭제하는 방법이 있습니까?

logRetentionHours속성 을 변경하기 위해 KafkaConfig.scala 파일을 수정할 수 있습니까 ? 소비자가 메시지를 읽는 즉시 메시지가 삭제되는 방법이 있습니까?

생산자를 사용하여 어딘가에서 데이터를 가져오고 소비자가 소비하는 특정 주제로 데이터를 보내고 있는데, 실행할 때마다 해당 주제의 모든 데이터를 삭제할 수 있습니까? 나는 주제에 매번 새로운 데이터만을 원합니다. 어떻게 든 주제를 다시 초기화하는 방법이 있습니까?


답변:


63

아직 지원되지 않는다고 생각하지 마십시오. JIRA 문제 "Add delete topic support"를 살펴보십시오 .

수동으로 삭제하려면 :

  1. 클러스터 종료
  2. kafka 로그 디렉토리 ( log.dirkafka 구성 파일 의 속성에 의해 지정됨 )와 사육사 데이터를 정리합니다.
  3. 클러스터 다시 시작

주어진 주제에 대해 할 수있는 것은

  1. 카프카 중지
  2. 파티션에 특정한 kafka 로그를 정리합니다. kafka는 로그 파일을 "logDir / topic-partition"형식으로 저장하므로 "MyTopic"이라는 주제의 경우 파티션 ID 0에 대한 로그 가 속성으로 지정된 /tmp/kafka-logs/MyTopic-0위치에 저장됩니다 ./tmp/kafka-logslog.dir
  3. kafka 다시 시작

이것은 NOT좋고 권장되는 접근 방식이지만 작동합니다. Kafka 브로커 구성 파일에서 log.retention.hours.per.topic속성은 다음을 정의하는 데 사용됩니다.The number of hours to keep a log file before deleting it for some specific topic

또한 소비자가 읽는 즉시 메시지가 삭제되는 방법이 있습니까?

로부터 카프카 문서 :

Kafka 클러스터는 사용 여부에 관계없이 게시 된 모든 메시지를 구성 가능한 기간 동안 유지합니다. 예를 들어 로그 보존이 2 일로 설정된 경우 메시지가 게시 된 후 2 일 동안 사용할 수 있으며 그 이후에는 공간을 확보하기 위해 폐기됩니다. Kafka의 성능은 데이터 크기와 관련하여 효과적으로 일정하므로 많은 데이터를 유지하는 것은 문제가되지 않습니다.

실제로 소비자별로 유지되는 유일한 메타 데이터는 "오프셋"이라고하는 로그에서 소비자의 위치입니다. 이 오프셋은 소비자에 의해 제어됩니다. 일반적으로 소비자는 메시지를 읽을 때 오프셋을 선형으로 진행하지만 실제로 위치는 소비자가 제어하며 원하는 순서대로 메시지를 소비 할 수 있습니다. 예를 들어 소비자는 이전 오프셋으로 재설정하여 재 처리 할 수 ​​있습니다.

시작을 찾기위한 카프카 0.8 읽어 오프셋 단순 소비자 예를 그들이 말하는을

Kafka는 도움이되는 두 개의 상수를 포함 kafka.api.OffsetRequest.EarliestTime()하고 있으며, 로그에서 데이터의 시작 부분을 찾고 거기에서 스트리밍을 시작하고 kafka.api.OffsetRequest.LatestTime()새 메시지 만 스트리밍합니다.

소비자 측에서 오프셋을 관리하기위한 예제 코드도 찾을 수 있습니다.

    public static long getLastOffset(SimpleConsumer consumer, String topic, int partition,
                                 long whichTime, String clientName) {
    TopicAndPartition topicAndPartition = new TopicAndPartition(topic, partition);
    Map<TopicAndPartition, PartitionOffsetRequestInfo> requestInfo = new HashMap<TopicAndPartition, PartitionOffsetRequestInfo>();
    requestInfo.put(topicAndPartition, new PartitionOffsetRequestInfo(whichTime, 1));
    kafka.javaapi.OffsetRequest request = new kafka.javaapi.OffsetRequest(requestInfo, kafka.api.OffsetRequest.CurrentVersion(),clientName);
    OffsetResponse response = consumer.getOffsetsBefore(request);

    if (response.hasError()) {
        System.out.println("Error fetching data Offset Data the Broker. Reason: " + response.errorCode(topic, partition) );
        return 0;
    }
    long[] offsets = response.offsets(topic, partition);
    return offsets[0];
}

JIRA 문제에 대한 올바른 링크가 issues.apache.org/jira/browse/KAFKA-330
asmaier

4
이 주제는 사육사에 나열되어 있으므로 여기에 계속 표시됩니다. 당신은 brokers/topics/<topic_to_delete>그것을 제거하기 위해 로그뿐만 아니라 아래의 모든 것을 재귀 적으로 삭제 해야합니다.
제출 됨

3
이슈 링크에 따르면 버전 0.8.1 이후 토픽을 삭제할 수 있습니다. 에서 자세한 도움말을 볼 수 있습니다 kafka-run-class.sh kafka.admin.DeleteTopicCommand.
Jay

5
업데이트 : 명령이 변경됩니다 카프카 0.8.2의로 :kafka-run-class.sh kafka.admin.TopicCommand --delete --topic [topic_to_delete] --zookeeper localhost:2181
제이 테일러

이제 토픽 삭제 기능이 추가되었다고 생각합니다. 아마도 다음 안정 릴리스에있을 것입니다.
ha9u63ar

70

내가 여기서 언급했듯이 Purge Kafka Queue :

빠른 시작 예제를 위해 Kafka 0.8.2에서 테스트되었습니다. 먼저 config 폴더 아래의 server.properties 파일에 한 줄을 추가합니다.

delete.topic.enable=true

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

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

2
Btw, 누군가 궁금해하는 경우 옵션을 추가 한 후 Kafka 서버를 다시 시작할 필요가 없습니다.
problemofficer

14

kafka 0.10으로 테스트

1. stop zookeeper & Kafka server,
2. then go to 'kafka-logs' folder , there you will see list of kafka topic folders, delete folder with topic name
3. go to 'zookeeper-data' folder , delete data inside that.
4. start zookeeper & kafka server again.

참고 : zookeeper-data 폴더가 아닌 kafka-logs 내부의 주제 폴더를 삭제하는 경우 주제가 여전히 존재하는 것을 볼 수 있습니다.


8

더러운 해결 방법으로 주제별 런타임 보존 설정을 조정할 수 있습니다 bin/kafka-topics.sh --zookeeper localhost:2181 --alter --topic my_topic --config retention.bytes=1( 예 : retention.bytes = 0 도 작동 할 수 있음).

잠시 후 kafka가 공간을 확보해야합니다. 이것이 주제를 다시 만드는 것과 비교하여 어떤 의미가 있는지 확실하지 않습니다.

추신. 카프카 청소가 끝나면 보존 설정을 다시 가져 오는 것이 좋습니다.

retention.ms기록 데이터를 유지 하는 데 사용할 수도 있습니다.


8

다음은 localhost를 zookeeper 서버로 가정하고 Kafka_Home이 설치 디렉토리로 설정되어 있다고 가정하고 Kafka 토픽을 비우고 삭제하는 스크립트입니다.

이 스크립트는 아래의 것 비우 1 초 자사의 유지 시간을 설정 한 후 설정을 제거하여 주제를 :

#!/bin/bash
echo "Enter name of topic to empty:"
read topicName
/$Kafka_Home/bin/kafka-configs --zookeeper localhost:2181 --alter --entity-type topics --entity-name $topicName --add-config retention.ms=1000
sleep 5
/$Kafka_Home/bin/kafka-configs --zookeeper localhost:2181 --alter --entity-type topics --entity-name $topicName --delete-config retention.ms

토픽 을 완전히 삭제 하려면 적용 가능한 모든 kafka 브로커를 중지하고 kafka 로그 디렉토리 (기본값 : / tmp / kafka-logs)에서 해당 디렉토리를 제거한 다음이 스크립트를 실행하여 zookeeper에서 토픽을 제거해야합니다. zookeeper에서 삭제되었는지 확인하려면 ls / brokers / topics의 출력에 더 이상 주제가 포함되지 않아야합니다.

#!/bin/bash
echo "Enter name of topic to delete from zookeeper:"
read topicName
/$Kafka_Home/bin/zookeeper-shell localhost:2181 <<EOF
rmr /brokers/topics/$topicName
ls /brokers/topics
quit
EOF

1
이는 유지 확인이 수면 5 초 이내에 발생하는 경우에만 작동합니다. 여기에 명시된대로 수표가 확실히 통과 될 때까지 수면을 취하십시오 :grep "log.retention.check.interval" $Kafka_Home/config/server.properties
colin

2
첫 번째 명령에 작은 실수가 있으므로 대답을 편집하고 싶었습니다. 그러나 한 문자 편집은 허용되지 않습니다. 사실이 아니다 --add config는 오히려--add-config
SRC

7

우리는 중간 수준의 성공으로 다른 답변이 설명하는 것을 거의 시도했습니다. 우리에게 실제로 효과가 있었던 것은 (Apache Kafka 0.8.1) class 명령입니다.

sh kafka-run-class.sh kafka.admin.DeleteTopicCommand --topic yourtopic --zookeeper localhost : 2181


2
0.8.1에서 이것을 시도했습니다. 이 명령은 "삭제 성공!"을 반환합니다. 그러나 로그 폴더 내의 파티션은 삭제되지 않습니다.
dilm

8
0.8.2.1 (자작)에서 시도했는데이 오류가 발생합니다. Error: Could not find or load main class kafka.admin.DeleteTopicCommand
Thanish 2015-04-06

2
새로운 kafka (0.8.2)부터 sh kafka-run-class.sh kafka.admin.TopicCommand --delete --topic [topic_for_delete] --zookeeper localhost : 2181입니다. delete.topic.enable이 true인지 확인하십시오.
Hoàng Long

4

Brew 사용자 용

brew나처럼 사용 하고 악명 높은 kafka-logs폴더를 검색하는 데 많은 시간을 낭비 했다면 더 이상 두려워하지 마십시오 . (그리고 그것이 당신과 Homebrew, Kafka 등의 여러 버전에서 작동하는지 알려주십시오 :))

아마도 다음에서 찾을 수 있습니다.

위치:

/usr/local/var/lib/kafka-logs


실제로 그 길을 찾는 방법

(이것은 기본적으로 brew를 통해 설치하는 모든 앱에도 유용합니다)

1) brew services list

kafka가 matbhz /Users/matbhz/Library/LaunchAgents/homebrew.mxcl.kafka.plist를 시작했습니다.

2) plist위에서 찾은 내용을 열고 읽습니다.

3) server.properties내 경우에는 위치를 정의하는 라인을 찾으십시오 .

  • /usr/local/etc/kafka/server.properties

4) log.dirs라인을 찾으십시오 .

log.dirs = / usr / local / var / lib / kafka-logs

5) 해당 위치로 이동하여 원하는 주제에 대한 로그를 삭제하십시오.

6) Kafka를 다시 시작하십시오. brew services restart kafka


2

주제 및 해당 파티션에 대한 모든 데이터는에 저장됩니다 tmp/kafka-logs/. 또한 형식으로 저장 topic-partionNumber되므로 주제를 삭제하려는 경우 다음을 수행 newTopic할 수 있습니다.

  • 카프카 중지
  • 파일 삭제 rm -rf /tmp/kafka-logs/newTopic-*

1
  1. ZooKeeper 및 Kafka 중지
  2. server.properties에서 log.retention.hours 값을 변경하십시오. 댓글을 달고 log.retention.hours추가 할 수 있습니다 log.retention.ms=1000. Kafka Topic에 대한 기록은 단 1 초 동안 유지됩니다.
  3. 사육사와 카프카를 시작합니다.
  4. 소비자 콘솔에서 확인하십시오. 콘솔을 처음 열었을 때 레코드가 거기에있었습니다. 그러나 콘솔을 다시 열면 레코드가 제거되었습니다.
  5. 나중에 log.retention.hours원하는 그림 의 값을 설정할 수 있습니다 .

1

kafka 2.3.0 버전부터 Kafka를 소프트 삭제하는 다른 방법이 있습니다 (이전 접근 방식은 더 이상 사용되지 않음).

retention.ms를 1 초 (1000ms)로 업데이트 한 다음 1 분 후 다시 기본 설정 즉, 7 일 (168 시간, 604,800,000 ms)로 설정합니다.

소프트 삭제 :-(rentention.ms = 1000) (kafka-configs.sh 사용)

bin/kafka-configs.sh --zookeeper 192.168.1.10:2181 --alter --entity-name kafka_topic3p3r --entity-type topics  --add-config retention.ms=1000
Completed Updating config for entity: topic 'kafka_topic3p3r'.

기본값으로 설정 : -7 일 (168 시간, 보존 .ms = 604800000)

bin/kafka-configs.sh --zookeeper 192.168.1.10:2181 --alter --entity-name kafka_topic3p3r --entity-type topics  --add-config retention.ms=604800000


0

이 스크립트를 사용합니다.

#!/bin/bash
topics=`kafka-topics --list --zookeeper zookeeper:2181`
for t in $topics; do 
    for p in retention.ms retention.bytes segment.ms segment.bytes; do
        kafka-topics --zookeeper zookeeper:2181 --alter --topic $t --config ${p}=100
    done
done
sleep 60
for t in $topics; do 
    for p in retention.ms retention.bytes segment.ms segment.bytes; do
        kafka-topics --zookeeper zookeeper:2181 --alter --topic $t --delete-config ${p}
    done
done

0

통합 테스트 실행 후 아래 유틸리티를 사용하여 정리합니다.

최신 AdminZkClientAPI를 사용합니다 . 이전 API는 더 이상 사용되지 않습니다.

import javax.inject.Inject
import kafka.zk.{AdminZkClient, KafkaZkClient}
import org.apache.kafka.common.utils.Time

class ZookeeperUtils @Inject() (config: AppConfig) {

  val testTopic = "users_1"

  val zkHost = config.KafkaConfig.zkHost
  val sessionTimeoutMs = 10 * 1000
  val connectionTimeoutMs = 60 * 1000
  val isSecure = false
  val maxInFlightRequests = 10
  val time: Time = Time.SYSTEM

  def cleanupTopic(config: AppConfig) = {

    val zkClient = KafkaZkClient.apply(zkHost, isSecure, sessionTimeoutMs, connectionTimeoutMs, maxInFlightRequests, time)
    val zkUtils = new AdminZkClient(zkClient)

    val pp = new Properties()
    pp.setProperty("delete.retention.ms", "10")
    pp.setProperty("file.delete.delay.ms", "1000")
    zkUtils.changeTopicConfig(testTopic , pp)
    //    zkUtils.deleteTopic(testTopic)

    println("Waiting for topic to be purged. Then reset to retain records for the run")
    Thread.sleep(60000L)

    val resetProps = new Properties()
    resetProps.setProperty("delete.retention.ms", "3000000")
    resetProps.setProperty("file.delete.delay.ms", "4000000")
    zkUtils.changeTopicConfig(testTopic , resetProps)

  }


}

항목 삭제 옵션이 있습니다. 그러나 삭제 대상으로 표시됩니다. Zookeeper는 나중에 주제를 삭제합니다. 예측할 수 없을 정도로 길 수 있으므로 retention.ms 접근 방식을 선호합니다.

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