Jangan kira itu didukung. Lihat masalah JIRA ini "Tambahkan dukungan penghapusan topik".
Untuk menghapus secara manual:
- Matikan cluster
- Bersihkan dir log kafka (ditentukan oleh
log.dir
atribut di file konfigurasi kafka ) serta data penjaga kebun binatang
- Mulai ulang cluster
Untuk topik tertentu apa yang dapat Anda lakukan adalah
- Hentikan kafka
- Bersihkan kafka log khusus untuk partisi, kafka menyimpan file lognya dalam format "logDir / topic-partition" sehingga untuk topik bernama "MyTopic", log untuk partisi id 0 akan disimpan di
/tmp/kafka-logs/MyTopic-0
tempat /tmp/kafka-logs
yang ditentukan oleh log.dir
atribut
- Mulai ulang kafka
Ini adalah NOT
pendekatan yang bagus dan direkomendasikan tetapi seharusnya berhasil. Di file konfigurasi broker Kafka, log.retention.hours.per.topic
atribut digunakan untuk menentukanThe number of hours to keep a log file before deleting it for some specific topic
Selain itu, adakah cara agar pesan dihapus segera setelah konsumen membacanya?
Dari Dokumentasi Kafka :
Kluster Kafka menyimpan semua pesan yang diterbitkan — baik telah dikonsumsi maupun tidak — untuk periode waktu yang dapat dikonfigurasi. Misalnya jika retensi log disetel ke dua hari, maka selama dua hari setelah pesan diterbitkan, pesan tersebut tersedia untuk dikonsumsi, setelah itu akan dibuang untuk mengosongkan ruang. Kinerja Kafka secara efektif konstan sehubungan dengan ukuran data sehingga menyimpan banyak data bukanlah masalah.
Faktanya, satu-satunya metadata yang dipertahankan per konsumen adalah posisi konsumen dalam log, yang disebut "offset". Offset ini dikontrol oleh konsumen: biasanya konsumen akan memajukan offsetnya secara linier saat membaca pesan, tetapi pada kenyataannya posisinya dikontrol oleh konsumen dan dapat menggunakan pesan dalam urutan apa pun yang disukainya. Misalnya konsumen dapat mengatur ulang ke offset yang lebih lama untuk diproses ulang.
Untuk menemukan awal offset untuk membaca di Kafka 0,8 contoh Konsumen Sederhana yang mereka katakan
Kafka menyertakan dua konstanta untuk membantu, kafka.api.OffsetRequest.EarliestTime()
menemukan awal data di log dan mulai streaming dari sana, kafka.api.OffsetRequest.LatestTime()
hanya akan mengalirkan pesan baru.
Anda juga dapat menemukan kode contoh di sana untuk mengelola offset di ujung konsumen Anda.
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];
}