Đừng nghĩ rằng nó được hỗ trợ được nêu ra. Hãy xem vấn đề JIRA này "Thêm hỗ trợ xóa chủ đề".
Để xóa thủ công:
- Tắt cụm
- Làm sạch dir nhật ký kafka (được chỉ định bởi
log.dir
thuộc tính trong tệp cấu hình kafka ) cũng như dữ liệu của người giữ vườn thú
- Khởi động lại cụm
Đối với bất kỳ chủ đề nào bạn có thể làm là
- Dừng kafka
- Làm sạch nhật ký kafka cụ thể cho phân vùng, kafka lưu trữ tệp nhật ký của nó ở định dạng "logDir / topic-partition" vì vậy đối với chủ đề có tên "MyTopic", nhật ký cho phân vùng id 0 sẽ được lưu trữ ở
/tmp/kafka-logs/MyTopic-0
nơi /tmp/kafka-logs
được chỉ định bởi log.dir
thuộc tính
- Khởi động lại kafka
Đây là NOT
một cách tiếp cận tốt và được khuyến khích nhưng nó sẽ hiệu quả. Trong tệp cấu hình nhà môi giới Kafka, log.retention.hours.per.topic
thuộc tính được sử dụng để xác địnhThe number of hours to keep a log file before deleting it for some specific topic
Ngoài ra, có cách nào để xóa các tin nhắn ngay khi người tiêu dùng đọc nó không?
Từ Tài liệu Kafka :
Cụm Kafka giữ lại tất cả các thông báo đã xuất bản — cho dù chúng đã được sử dụng hay chưa — trong một khoảng thời gian có thể định cấu hình. Ví dụ: nếu việc lưu giữ nhật ký được đặt thành hai ngày, thì trong hai ngày sau khi thông báo được xuất bản, nó sẽ có sẵn để sử dụng, sau đó nó sẽ bị loại bỏ để giải phóng dung lượng. Hiệu suất của Kafka không đổi về mặt kích thước dữ liệu nên việc giữ lại nhiều dữ liệu không phải là vấn đề.
Trên thực tế, siêu dữ liệu duy nhất được giữ lại trên cơ sở mỗi người tiêu dùng là vị trí của người tiêu dùng trong nhật ký, được gọi là "phần bù". Sự bù đắp này được kiểm soát bởi người tiêu dùng: thông thường người tiêu dùng sẽ tăng tuyến tính phần bù của nó khi họ đọc tin nhắn, nhưng trên thực tế, vị trí được kiểm soát bởi người tiêu dùng và nó có thể đọc tin nhắn theo bất kỳ thứ tự nào họ thích. Ví dụ: một người tiêu dùng có thể đặt lại về độ lệch cũ hơn để xử lý lại.
Để tìm điểm bù bắt đầu để đọc trong ví dụ Người tiêu dùng đơn giản Kafka 0.8, họ nói
Kafka bao gồm hai hằng số để trợ giúp, kafka.api.OffsetRequest.EarliestTime()
tìm phần đầu của dữ liệu trong nhật ký và bắt đầu phát trực tuyến từ đó, kafka.api.OffsetRequest.LatestTime()
sẽ chỉ phát trực tuyến các tin nhắn mới.
Bạn cũng có thể tìm thấy mã ví dụ ở đó để quản lý phần bù ở đầu người tiêu dùng của bạn.
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];
}