อย่าคิดว่ามันรองรับเลย ดูปัญหา JIRA "เพิ่มการสนับสนุนการลบหัวข้อ"
ในการลบด้วยตนเอง:
- ปิดคลัสเตอร์
- dir บันทึก Kafka สะอาด (ระบุโดย
log.dir
แอตทริบิวต์ใน Kafka การตั้งค่าไฟล์) รวมทั้งข้อมูล Zookeeper
- รีสตาร์ทคลัสเตอร์
สำหรับหัวข้อที่กำหนดสิ่งที่คุณทำได้คือ
- หยุดคาฟคา
- ทำความสะอาดบันทึก kafka เฉพาะสำหรับพาร์ติชัน kafka จัดเก็บไฟล์บันทึกในรูปแบบ "logDir / topic-partition" ดังนั้นสำหรับหัวข้อที่ชื่อ "MyTopic" บันทึกสำหรับพาร์ติชัน id 0 จะถูกเก็บไว้ใน
/tmp/kafka-logs/MyTopic-0
ที่ที่/tmp/kafka-logs
ระบุโดยlog.dir
แอตทริบิวต์
- รีสตาร์ทคาฟคา
นี่เป็น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];
}