Purge Kafka หัวข้อ


185

มีวิธีกำจัดหัวข้อในคาฟคาหรือไม่?

ฉันผลักข้อความที่มีขนาดใหญ่เกินไปในหัวข้อข้อความของคาฟคาในเครื่องท้องถิ่นของฉันตอนนี้ฉันได้รับข้อผิดพลาด:

kafka.common.InvalidMessageSizeException: invalid message size

การเพิ่มfetch.sizeไม่เหมาะในที่นี้เพราะฉันไม่ต้องการรับข้อความที่ยิ่งใหญ่

คำตอบ:


359

อัปเดตเวลาเก็บข้อมูลชั่วคราวในหัวข้อเป็นหนึ่งวินาที:

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

จากนั้นรอให้การล้างมีผล (ประมาณหนึ่งนาที) เมื่อล้างเรียกคืนก่อนหน้านี้retention.msค่า


8
นั่นเป็นคำตอบที่ดี แต่คุณสามารถเพิ่มคำอธิบายวิธีเริ่มต้นด้วยการตรวจสอบค่าการเก็บข้อมูลปัจจุบันของหัวข้อได้หรือไม่
Greg Dubicki

28
ฉันไม่แน่ใจเกี่ยวกับการตรวจสอบการกำหนดค่าปัจจุบัน แต่ฉันเชื่อว่าการรีเซ็ตเป็นค่าเริ่มต้นดูเหมือนว่า:bin/kafka-topics.sh --zookeeper localhost:2181 --alter --topic MyTopic --deleteConfig retention.ms
aspergillusOryzae

15
หรือขึ้นอยู่กับรุ่น:--delete-config retention.ms
aspergillusOryzae

3
เพียง fyi สำหรับ 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 - ผู้ดูแลระบบ <zkhost>: 2181 - อธิบาย - หัวข้อหัวข้อประเภท - - ชื่อ - ชื่อ <ชื่อหัวข้อ>
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.propertiesตามคำเตือนที่พิมพ์โดยคำสั่งดังกล่าวพูดว่าNote: This will have no impact if delete.topic.enable is not set to true.
Patrizio Bertoni

3
สิ่งนี้ไม่ได้เกิดขึ้นทันทีเสมอไป บางครั้งมันก็แค่ทำเครื่องหมายสำหรับการลบและการลบที่แท้จริงจะเกิดขึ้นในภายหลัง
Gaurav Khare

48

นี่คือขั้นตอนที่ฉันทำตามเพื่อลบหัวข้อที่มีชื่อMyTopic:

  1. อธิบายหัวข้อและอย่านำรหัสนายหน้ามาใช้
  2. หยุด Apache Kafka daemon สำหรับแต่ละ ID โบรกเกอร์ที่แสดงรายการ
  3. rm -rf /tmp/kafka-logs/MyTopic-0เชื่อมต่อกับแต่ละโบรกเกอร์และลบโฟลเดอร์ข้อมูลหัวข้อเช่น ทำซ้ำสำหรับพาร์ติชันอื่น ๆ และแบบจำลองทั้งหมด
  4. ลบข้อมูลเมตาของหัวข้อ: zkCli.shจากนั้นrmr /brokers/MyTopic
  5. เริ่ม Apache Kafka daemon สำหรับเครื่องที่หยุดแต่ละเครื่อง

หากคุณพลาดขั้นตอนที่ 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
นี่เป็นวิธีเดียวในเวลาที่เขียน
Thomas Bratt

2
ทำงานให้ฉันใน Kafka 0.8.2.1 แม้ว่า topis ใน zookeeper อยู่ภายใต้ / โบรกเกอร์ / หัวข้อ / <ชื่อหัวข้อที่นี่>
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 สำหรับตัวอย่างเริ่มต้นอย่างรวดเร็ว: ขั้นแรกเพิ่มหนึ่งบรรทัดไปยังไฟล์ server.properties ภายใต้โฟลเดอร์ config:

delete.topic.enable=true

จากนั้นคุณสามารถเรียกใช้คำสั่งนี้:

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

6

จากคาฟก้า 1.1

ล้างหัวข้อ

bin/kafka-configs.sh --zookeeper localhost:2181 --alter --entity-type topics --entity-name tp_binance_kline --add-config retention.ms=100

รอ 1 นาทีเพื่อให้แน่ใจว่าคาฟคาล้างหัวข้อลบการกำหนดค่าแล้วไปที่ค่าเริ่มต้น

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
Will

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

UPDATE: คำตอบนี้เกี่ยวข้องกับ Kafka 0.6 สำหรับ Kafka 0.8 และต่อมาดูคำตอบจาก @Patrick

ใช่หยุด kafka และลบไฟล์ทั้งหมดจากไดเรกทอรีย่อยที่เกี่ยวข้องด้วยตนเอง (หาได้ง่ายในไดเรกทอรีข้อมูล kafka) หลังจาก kafka รีสตาร์ทหัวข้อจะว่างเปล่า


สิ่งนี้ต้องทำให้นายหน้าล้มลงและเป็นการแฮ็คที่ดีที่สุด คำตอบของ Steven Appleyard นั้นดีที่สุดแน่นอน
Jeff Maass

@MaasSql ฉันเห็นด้วย :) คำตอบนี้มีอายุสองปีประมาณ 0.6 รุ่น ฟังก์ชัน "แก้ไขหัวข้อ" และ "ลบหัวข้อ" ได้ถูกนำมาใช้ในภายหลัง
ไฟป่า

คำตอบของ Steven Appleyard นั้นช่างแสนแฮ็คอย่างนี้
Banjocat

การมีแอปพลิเคชันจัดการการลบข้อมูลของตัวเองในวิธีที่ได้รับการสนับสนุนนั้นมีความยุ่งยากน้อยกว่าการปิดแอปพลิเคชันดังกล่าวและการลบสิ่งที่คุณคิดว่าเป็นไฟล์ข้อมูลทั้งหมดจากนั้นจึงเปิดอีกครั้ง
Nick

3

วิธีที่ง่ายที่สุดคือการตั้งวันที่ของไฟล์บันทึกแต่ละไฟล์ว่าเก่ากว่าระยะเวลาการเก็บรักษา จากนั้นนายหน้าควรทำความสะอาดและนำออกให้คุณภายในไม่กี่วินาที ข้อเสนอนี้มีข้อดีหลายประการ:

  1. ไม่จำเป็นต้องรื้อโบรกเกอร์มันเป็นการดำเนินการแบบรันไทม์
  2. หลีกเลี่ยงความเป็นไปได้ของข้อยกเว้นออฟเซตที่ไม่ถูกต้อง (เพิ่มเติมจากด้านล่าง)

จากประสบการณ์ของฉันกับ Kafka 0.7.x การลบไฟล์บันทึกและเริ่มต้นนายหน้าใหม่อาจนำไปสู่ข้อยกเว้นออฟเซตที่ไม่ถูกต้องสำหรับผู้บริโภคบางราย สิ่งนี้จะเกิดขึ้นเนื่องจากโบรกเกอร์รีสตาร์ทออฟเซ็ตที่ศูนย์ (ในกรณีที่ไม่มีไฟล์บันทึกใด ๆ ที่มีอยู่) และผู้บริโภคที่เคยบริโภคจากหัวข้อก่อนหน้านี้จะเชื่อมต่อใหม่เพื่อขอออฟเซ็ต [ครั้งเดียวที่ถูกต้อง] หากการชดเชยนี้เกิดขึ้นนอกขอบเขตของบันทึกหัวข้อใหม่จะไม่เกิดอันตรายใด ๆ และผู้บริโภคจะกลับมาทำงานที่จุดเริ่มต้นหรือจุดสิ้นสุด แต่ถ้าออฟเซ็ตตกอยู่ในขอบเขตของบันทึกหัวข้อใหม่นายหน้าจะพยายามดึงข้อมูลชุดข้อความ แต่ล้มเหลวเนื่องจากออฟเซ็ตไม่จัดแนวกับข้อความจริง

สิ่งนี้สามารถลดลงได้ด้วยการล้างการชดเชยผู้บริโภคใน zookeeper สำหรับหัวข้อนั้น แต่ถ้าคุณไม่ต้องการหัวข้อที่บริสุทธิ์และเพียงแค่ต้องการลบเนื้อหาที่มีอยู่แล้วเพียงแค่ 'แตะ' เพียงไม่กี่บันทึกหัวข้อจะง่ายกว่าและเชื่อถือได้มากกว่าหยุดโบรกเกอร์ลบบันทึกหัวข้อและล้างโหนดผู้ดูแลสัตว์บางอย่าง .


วิธี "กำหนดวันที่ของไฟล์บันทึกแต่ละไฟล์ให้เก่ากว่าช่วงเวลาการเก็บรักษา"? ขอบคุณ
bylijinnan

3

คำแนะนำของโทมัสดีมาก แต่น่าเสียดายที่zkCliในรุ่นเก่าของ Zookeeper (เช่น 3.3.6) rmrดูเหมือนจะไม่สนับสนุน ยกตัวอย่างเปรียบเทียบการดำเนินงานบรรทัดคำสั่งในที่ทันสมัย Zookeeperกับรุ่น 3.3

หากคุณประสบกับ Zookeeper เวอร์ชั่นเก่าวิธีหนึ่งคือการใช้ไลบรารี่ของลูกค้าเช่นzc.zkสำหรับ Python สำหรับคนที่ไม่คุ้นเคยกับงูหลามที่คุณจำเป็นต้องติดตั้งโดยใช้pipหรือeasy_install จากนั้นเริ่มต้น Python shell ( 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 แต่น่าเสียดายที่มันยังลบออฟเซ็ต Consumer ที่ไม่เกี่ยวข้องสำหรับ 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

หวังว่ามันจะช่วยประหยัดเวลาของใครบางคน

นอกจากนี้โปรดทราบว่าข้อความจะไม่ถูกลบทันทีและจะเกิดขึ้นเมื่อส่วนของบันทึกจะถูกปิด


คุณสามารถเอ็กซีคิวต์เข้าสู่โบรกเกอร์ได้ ปัญหาคือlocalhost:2181... เช่นคุณเข้าใจผิดเกี่ยวกับคุณสมบัติการเชื่อมต่อเครือข่าย Docker นอกจากนี้ไม่มีผู้ดูแลตู้คอนเทนเนอร์ทุกคนkafka-topicsดังนั้นจึงเป็นการดีที่สุดที่จะไม่ใช้วิธีนั้น การติดตั้ง Kafka ล่าสุดอนุญาตให้--bootstrap-serversเปลี่ยนหัวข้อแทน--zookeeper
OneCricketeer

1
ถึงกระนั้นก็ตามเอ็กซีคิวต์ลงในคอนเทนเนอร์ผู้ดูแลสัตว์ดูเหมือนว่าผิด you can use - Zookeeper Zookeeper: 2181` จากตู้คาฟคาเป็นจุดของฉัน หรือแม้กระทั่งแบ่งออกเป็นบรรทัด Zookeeper จากไฟล์ server.properties
OneCricketeer

@ cricket_007 เฮ้ขอบคุณสำหรับการนี้จริงๆผมแก้ไขคำตอบให้เราทราบว่าบางสิ่งบางอย่างก็ยังไม่ไปที่นั่น
วลาดิเมีย Semashkin

1

ไม่สามารถเพิ่มเป็นความคิดเห็นได้เนื่องจากขนาด: ไม่แน่ใจว่านี่เป็นความจริงนอกเหนือจากการอัปเดตการเก็บข้อมูลและการเก็บข้อมูลเป็นไบต์ แต่ฉันสังเกตเห็นนโยบายการล้างข้อมูลหัวข้อควรเป็น "ลบ" (ค่าเริ่มต้น) กดค้างไว้ที่ข้อความที่ยาวกว่านั่นคือหากเป็น "กะทัดรัด" คุณต้องระบุ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

นอกจากนี้ยังมีการตรวจสอบที่เร็วที่สุด / offsets ล่าสุดควรจะเหมือนกันเพื่อยืนยันว่าสิ่งนี้เกิดขึ้นเรียบร้อยแล้วยังสามารถตรวจสอบ 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>-*

ใน zookeeper:

  1. รันอินเตอร์เฟสบรรทัดคำสั่ง zookeeper
    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การกำหนดค่า จากนั้นคุณสามารถใช้คำสั่งแก้ไขข้างต้นเพื่อเปลี่ยนเป็น 1 วินาที (และเปลี่ยนกลับเป็นค่าเริ่มต้นในภายหลัง)

Topic:myTopic   PartitionCount:6        ReplicationFactor:1     Configs:retention.ms=86400000

1

จาก 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;
  }

คุณไม่จำเป็นต้องมี Zookeeper ใช้งานAdminClientหรือKafkaAdminClient
OneCricketeer
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.