Не думаю, что это поддерживается. Взгляните на этот выпуск JIRA «Добавить поддержку для удаления темы».
Чтобы удалить вручную:
- Завершите работу кластера
- Очистите каталог журнала kafka (указанный
log.dir
атрибутом в файле конфигурации kafka), а также данные zookeeper
- Перезагрузите кластер
Для любой заданной темы вы можете
- Стоп кафка
- Очистите журнал kafka, относящийся к разделу, kafka хранит свой файл журнала в формате «logDir / topic-partition», поэтому для темы с именем «MyTopic» журнал для идентификатора раздела 0 будет храниться
/tmp/kafka-logs/MyTopic-0
там, где /tmp/kafka-logs
это указано в log.dir
атрибуте
- Перезапустить кафку
Это 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 сохраняет все опубликованные сообщения - независимо от того, были они использованы - в течение настраиваемого периода времени. Например, если срок хранения журнала установлен на два дня, то в течение двух дней после публикации сообщения оно доступно для использования, после чего оно будет отброшено, чтобы освободить место. Производительность 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];
}