มีวิธีลบข้อมูลทั้งหมดจากหัวข้อหรือลบหัวข้อก่อนการรันทุกครั้งหรือไม่?


89

มีวิธีลบข้อมูลทั้งหมดจากหัวข้อหรือลบหัวข้อก่อนการรันทุกครั้งหรือไม่?

ฉันสามารถแก้ไขไฟล์ KafkaConfig.scala เพื่อเปลี่ยนlogRetentionHoursคุณสมบัติได้หรือไม่ มีวิธีลบข้อความทันทีที่ผู้บริโภคอ่านหรือไม่?

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


คำตอบ:


63

อย่าคิดว่ามันรองรับเลย ดูปัญหา JIRA "เพิ่มการสนับสนุนการลบหัวข้อ"

ในการลบด้วยตนเอง:

  1. ปิดคลัสเตอร์
  2. dir บันทึก Kafka สะอาด (ระบุโดยlog.dirแอตทริบิวต์ใน Kafka การตั้งค่าไฟล์) รวมทั้งข้อมูล Zookeeper
  3. รีสตาร์ทคลัสเตอร์

สำหรับหัวข้อที่กำหนดสิ่งที่คุณทำได้คือ

  1. หยุดคาฟคา
  2. ทำความสะอาดบันทึก kafka เฉพาะสำหรับพาร์ติชัน kafka จัดเก็บไฟล์บันทึกในรูปแบบ "logDir / topic-partition" ดังนั้นสำหรับหัวข้อที่ชื่อ "MyTopic" บันทึกสำหรับพาร์ติชัน id 0 จะถูกเก็บไว้ใน/tmp/kafka-logs/MyTopic-0ที่ที่/tmp/kafka-logsระบุโดยlog.dirแอตทริบิวต์
  3. รีสตาร์ทคาฟคา

นี่เป็นNOTแนวทางที่ดีและแนะนำ แต่ควรใช้งานได้จริง ในไฟล์log.retention.hours.per.topicกำหนดค่านายหน้า Kafka จะใช้แอตทริบิวต์เพื่อกำหนดThe number of hours to keep a log file before deleting it for some specific topic

นอกจากนี้ยังมีวิธีลบข้อความทันทีที่ผู้บริโภคอ่านหรือไม่?

จากเอกสารคาฟคา :

คลัสเตอร์ Kafka จะเก็บรักษาข้อความที่เผยแพร่ทั้งหมดไม่ว่าจะถูกใช้ไปหรือไม่ก็ตามตามระยะเวลาที่กำหนดได้ ตัวอย่างเช่นหากการเก็บรักษาบันทึกถูกตั้งค่าเป็นสองวันจากนั้นสองวันหลังจากที่เผยแพร่ข้อความข้อความนั้นจะพร้อมใช้งานหลังจากนั้นจะถูกทิ้งเพื่อเพิ่มพื้นที่ว่าง ประสิทธิภาพของ Kafka นั้นคงที่อย่างมีประสิทธิภาพเมื่อเทียบกับขนาดข้อมูลดังนั้นการเก็บรักษาข้อมูลจำนวนมากจึงไม่ใช่ปัญหา

ในความเป็นจริงข้อมูลเมตาเดียวที่เก็บรักษาไว้สำหรับผู้บริโภคแต่ละรายคือตำแหน่งของผู้บริโภคในบันทึกซึ่งเรียกว่า "ออฟเซ็ต" การชดเชยนี้ถูกควบคุมโดยผู้บริโภค: โดยปกติแล้วผู้บริโภคจะเลื่อนค่าออฟเซ็ตเป็นเชิงเส้นเมื่ออ่านข้อความ แต่ในความเป็นจริงตำแหน่งนั้นถูกควบคุมโดยผู้บริโภคและสามารถใช้ข้อความตามลำดับที่ต้องการได้ ตัวอย่างเช่นผู้บริโภคสามารถรีเซ็ตเป็นค่าชดเชยที่เก่ากว่าเพื่อประมวลผลใหม่

สำหรับการหาค่าชดเชยเริ่มต้นเพื่ออ่านใน Kafka 0.8 Simple Consumer ตัวอย่างที่พวกเขาพูด

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 คือissue.apache.org/jira/browse/KAFKA-330
asmaier

4
หัวข้อจะยังคงปรากฏที่นี่เนื่องจากอยู่ในรายชื่อผู้ดูแลสวนสัตว์ คุณจะต้องลบทุกอย่างซ้ำ ๆ ที่อยู่ด้านล่างbrokers/topics/<topic_to_delete>ตลอดจนบันทึกเพื่อกำจัดมัน
ส่งแล้ว

3
ตามลิงค์ปัญหาคุณสามารถลบหัวข้อหลังจากเวอร์ชัน 0.8.1 kafka-run-class.sh kafka.admin.DeleteTopicCommandคุณสามารถดูรายละเอียดความช่วยเหลือโดย
เจ

5
อัปเดต: ณ kafka 0.8.2 คำสั่งเปลี่ยนเป็น:kafka-run-class.sh kafka.admin.TopicCommand --delete --topic [topic_to_delete] --zookeeper localhost:2181
Jay Taylor

ฉันคิดว่าตอนนี้ได้เพิ่มฟังก์ชันการลบหัวข้อแล้ว น่าจะเป็นรุ่นที่เสถียรต่อไปจะมี
ha9u63ar

71

ดังที่ได้กล่าวไว้ที่นี่Purge Kafka Queue :

ทดสอบใน Kafka 0.8.2 สำหรับตัวอย่างเริ่มต้นอย่างรวดเร็วขั้นแรกเพิ่มหนึ่งบรรทัดไปยังไฟล์ server.properties ภายใต้โฟลเดอร์ config:

delete.topic.enable=true

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

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

2
Btw คุณไม่จำเป็นต้องรีสตาร์ทเซิร์ฟเวอร์ Kafka หลังจากเพิ่มตัวเลือกในกรณีที่มีใครสงสัย
problemofficer

14

ทดสอบด้วยคาฟคา 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.

หมายเหตุ: หากคุณกำลังลบโฟลเดอร์หัวข้อภายใน kafka-logs แต่ไม่ใช่จากโฟลเดอร์ zookeeper-data คุณจะเห็นหัวข้อยังคงอยู่


8

ในการแก้ปัญหาเบื้องต้นคุณสามารถปรับการตั้งค่าการเก็บรักษารันไทม์ตามหัวข้อเช่นbin/kafka-topics.sh --zookeeper localhost:2181 --alter --topic my_topic --config retention.bytes=1( retention.bytes = 0อาจใช้งานได้เช่นกัน)

หลังจากนั้นไม่นานคาฟคาควรเพิ่มพื้นที่ว่าง ไม่แน่ใจว่าสิ่งนี้มีผลกระทบหรือไม่เมื่อเทียบกับการสร้างหัวข้อใหม่

ปล. นำการตั้งค่าการเก็บรักษากลับมาดีกว่าเมื่อทำความสะอาดคาฟคาเสร็จแล้ว

คุณยังสามารถใช้retention.msเพื่อคงข้อมูลในอดีต


8

ด้านล่างนี้เป็นสคริปต์สำหรับล้างและลบหัวข้อ Kafka โดยสมมติว่า localhost เป็นเซิร์ฟเวอร์ zookeeper และ Kafka_Home ถูกตั้งค่าเป็นไดเร็กทอรีการติดตั้ง:

สคริปต์ด้านล่างจะทำให้หัวข้อว่างเปล่าโดยตั้งค่าเวลาเก็บรักษาเป็น 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 log dir (ค่าเริ่มต้น: / tmp / kafka-logs) จากนั้นเรียกใช้สคริปต์นี้เพื่อลบหัวข้อออกจาก zookeeper ในการตรวจสอบว่าถูกลบออกจาก Zookeeper ผลลัพธ์ของ ls / brokers / topic ไม่ควรรวมหัวข้ออีกต่อไป

#!/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) คือคำสั่งคลาส

sh kafka-run-class.sh kafka.admin.DeleteTopicCommand --topic yourtopic - ผู้ดูแลระบบ localhost: 2181


2
ลองสิ่งนี้ใน 0.8.1 คำสั่งส่งคืน "การลบสำเร็จ!" อย่างไรก็ตามจะไม่ลบพาร์ติชันภายในโฟลเดอร์บันทึก
dilm

8
พยายาม 0.8.2.1 (homebrew) และให้ข้อผิดพลาดนี้ Error: Could not find or load main class kafka.admin.DeleteTopicCommand
ธ นิช

2
สำหรับคาฟคาใหม่ (0.8.2) มันคือ sh kafka-run-class.sh kafka.admin.TopicCommand --delete --topic [topic_for_delete] --zookeeper localhost: 2181 ตรวจสอบให้แน่ใจว่า delete.topic.enable เป็นจริง
Hoàng Long

4

สำหรับผู้ใช้ชง

หากคุณกำลังใช้งานbrewเหมือนกับฉันและเสียเวลามากมายในการค้นหาkafka-logsโฟลเดอร์ที่น่าอับอายอย่ากลัวอีก (และโปรดแจ้งให้เราทราบหากวิธีนี้เหมาะกับคุณและ Homebrew, Kafka และอื่น ๆ อีกหลายเวอร์ชัน :))

คุณอาจจะพบมันภายใต้:

สถานที่:

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


วิธีค้นหาเส้นทางนั้นจริงๆ

(สิ่งนี้มีประโยชน์สำหรับทุกแอพที่คุณติดตั้งผ่านการชง)

1) brew services list

คาฟคาเริ่ม 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 เพียงวินาทีเดียว
  3. เริ่มผู้ดูแลสวนสัตว์และคาฟคา
  4. ตรวจสอบคอนโซลผู้บริโภค เมื่อฉันเปิดคอนโซลเป็นครั้งแรกบันทึกอยู่ที่นั่น แต่เมื่อฉันเปิดคอนโซลอีกครั้งบันทึกก็ถูกลบออก
  5. หลังจากนั้นคุณสามารถตั้งค่าเป็นตัวเลขlog.retention.hoursที่คุณต้องการ

1

ในเวอร์ชัน kafka 2.3.0 มีวิธีอื่นในการลบ Kafka แบบนุ่มนวล (วิธีการเดิมเลิกใช้แล้ว)

อัปเดต retention.ms เป็น 1 วินาที (1000ms) จากนั้นตั้งค่าอีกครั้งหลังจากนาทีเป็นค่าเริ่มต้นคือ 7 วัน (168 ชั่วโมง 604,800,000 ในมิลลิวินาที)

การลบแบบนุ่มนวล: - (rentention.ms = 1,000) (โดยใช้ 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

ในการลบหัวข้อจากคลัสเตอร์คาฟคาด้วยตนเองคุณสามารถตรวจสอบสิ่งนี้ได้ที่https://github.com/darrenfu/bigdata/issues/6 ขั้นตอนสำคัญที่พลาดไปมากในวิธีแก้ปัญหาส่วนใหญ่คือการลบ/config/topics/<topic_name>ใน ZK


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.