Не думайте, що це ще підтримується. Погляньте на випуск JIRA "Додати підтримку видалення теми".
Щоб видалити вручну:
- Вимкніть кластер
- Очистити каталог журналу kafka (вказаний
log.dir
атрибутом у файлі конфігурації kafka ), а також дані zookeeper
- Перезапустіть кластер
Для будь-якої заданої теми ви можете це зробити
- Зупиніть кафку
- Чистий журнал kafka, специфічний для розділу, kafka зберігає свій файл журналу у форматі "logDir / topic-partition", тому для теми з іменем "MyTopic" журнал для ідентифікатора розділу 0 буде зберігатися
/tmp/kafka-logs/MyTopic-0
там, де /tmp/kafka-logs
вказано log.dir
атрибутом
- Перезапустіть kafka
Це NOT
хороший і рекомендований підхід, але він повинен спрацювати. У конфігураційному файлі брокера Kafka log.retention.hours.per.topic
атрибут використовується для визначенняThe number of hours to keep a log file before deleting it for some specific topic
Крім того, чи існує спосіб видалення повідомлень, як тільки споживач їх прочитає?
З документації Кафки :
Кластер Kafka зберігає всі опубліковані повідомлення - незалежно від того, були вони спожиті - протягом певного періоду, який можна налаштувати. Наприклад, якщо для збереження журналу встановлено два дні, то протягом двох днів після публікації повідомлення воно буде доступне для споживання, після чого воно буде відкинуто, щоб звільнити місце. Продуктивність Кафки фактично постійна щодо розміру даних, тому збереження великої кількості даних не є проблемою.
Насправді єдиними метаданими, що зберігаються на основі споживача, є позиція споживача в журналі, що називається "зміщення". Цей зсув контролюється споживачем: зазвичай споживач просуває свій зсув лінійно, коли він читає повідомлення, але насправді позиція контролюється споживачем, і він може споживати повідомлення в будь-якому порядку, який йому подобається. Наприклад, споживач може повернутися до попереднього зміщення для повторної обробки.
Кажуть, що для пошуку початкового зміщення для читання у прикладі Kafka 0.8 Simple Consumer кажуть
Кафка включає дві константи, які допомагають, 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];
}