Есть ли способ удалить все данные из темы или удалить тему перед каждым запуском?

87

Есть ли способ удалить все данные из темы или удалить тему перед каждым запуском?

Могу ли я изменить файл KafkaConfig.scala, чтобы изменить logRetentionHoursсвойство? Есть ли способ удалить сообщения, как только потребитель их прочитает?

Я использую производителей для извлечения данных откуда-то и отправки данных в определенную тему, где потребляет потребитель. Могу ли я удалять все данные из этой темы при каждом запуске? Мне нужны только новые данные каждый раз в теме. Есть ли способ как-нибудь повторно инициализировать тему?

TommyT
источник
Повторяющийся вопрос: stackoverflow.com/questions/16284399/purge-kafka-queue
Марк Батлер

Ответы:

62

Не думаю, что это поддерживается. Взгляните на этот выпуск JIRA «Добавить поддержку для удаления темы».

Чтобы удалить вручную:

  1. Завершите работу кластера
  2. Очистите каталог журнала kafka (указанный log.dirатрибутом в файле конфигурации kafka), а также данные zookeeper
  3. Перезагрузите кластер

Для любой заданной темы вы можете

  1. Стоп кафка
  2. Очистите журнал kafka, относящийся к разделу, kafka хранит свой файл журнала в формате «logDir / topic-partition», поэтому для темы с именем «MyTopic» журнал для идентификатора раздела 0 будет храниться /tmp/kafka-logs/MyTopic-0там, где /tmp/kafka-logsэто указано в log.dirатрибуте
  3. Перезапустить кафку

Это 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];
}
Hild
источник
Я считаю, что правильная ссылка на проблему JIRA - issues.apache.org/jira/browse/KAFKA-330
asmaier
4
Тема по-прежнему будет отображаться здесь, потому что она указана в zookeeper. brokers/topics/<topic_to_delete>Чтобы избавиться от этого, вам придется рекурсивно удалить все, что находится ниже, а также журналы.
ОтправленоОтказано
3
По ссылке на выпуск можно удалить тему после версии 0.8.1. Вы можете просмотреть подробную справку по kafka-run-class.sh kafka.admin.DeleteTopicCommand.
Джей
5
Обновление: начиная с kafka 0.8.2 команда изменена на:kafka-run-class.sh kafka.admin.TopicCommand --delete --topic [topic_to_delete] --zookeeper localhost:2181
Джей Тейлор
Я думаю, что теперь добавлена ​​функция включения удаления темы. Вероятно, в следующем стабильном выпуске он будет.
ha9u63ar 05
70

Как я уже упоминал здесь, очистить очередь Kafka :

Протестировано в Kafka 0.8.2, для примера быстрого запуска: сначала добавьте одну строку в файл server.properties в папке config:

delete.topic.enable=true

затем вы можете запустить эту команду:

bin/kafka-topics.sh --zookeeper localhost:2181 --delete --topic test
Патрик
источник
2
Кстати, вам не нужно перезапускать сервер Kafka после добавления опции, если кому-то интересно.
problemofficer
14

Протестировано с кафкой 0.10

1. stop zookeeper & Kafka server,
2. then go to 'kafka-logs' folder , there you will see list of kafka topic folders, delete folder with topic name
3. go to 'zookeeper-data' folder , delete data inside that.
4. start zookeeper & kafka server again.

Примечание: если вы удаляете папки с темами внутри kafka-logs, но не из папки zookeeper-data, вы увидите, что темы все еще там.

свадеши
источник
8

В качестве грязного обходного пути вы можете настроить параметры хранения времени выполнения для каждой темы, например bin/kafka-topics.sh --zookeeper localhost:2181 --alter --topic my_topic --config retention.bytes=1( retention.bytes = 0 также может работать)

Через некоторое время кафка должен освободить место. Не уверен, имеет ли это какое-либо значение по сравнению с повторным созданием темы.

пс. Лучше вернуть настройки удержания, как только кафка закончил с очисткой.

Вы также можете использовать retention.msдля сохранения исторических данных

Иван Балашов
источник
8

Ниже приведены сценарии для очистки и удаления темы Kafka, предполагающей localhost в качестве сервера zookeeper, а Kafka_Home установлен в каталог установки:

Приведенный ниже сценарий очистит тему, установив время хранения на 1 секунду, а затем удалив конфигурацию:

#!/bin/bash
echo "Enter name of topic to empty:"
read topicName
/$Kafka_Home/bin/kafka-configs --zookeeper localhost:2181 --alter --entity-type topics --entity-name $topicName --add-config retention.ms=1000
sleep 5
/$Kafka_Home/bin/kafka-configs --zookeeper localhost:2181 --alter --entity-type topics --entity-name $topicName --delete-config retention.ms

Чтобы полностью удалить темы, вы должны остановить все применимые брокеры kafka и удалить их каталог (ы) из каталога журналов kafka (по умолчанию: / tmp / kafka-logs), а затем запустить этот сценарий, чтобы удалить тему из zookeeper. Чтобы убедиться, что он был удален из zookeeper, вывод ls / brokers / themes больше не должен включать тему:

#!/bin/bash
echo "Enter name of topic to delete from zookeeper:"
read topicName
/$Kafka_Home/bin/zookeeper-shell localhost:2181 <<EOF
rmr /brokers/topics/$topicName
ls /brokers/topics
quit
EOF
вдлен
источник
1
Это будет работать только в том случае, если проверка удержания произойдет в течение этих 5 секунд сна. Пожалуйста , убедитесь , что вы спите , пока проверка не будет окончательно принят , как указано здесь:grep "log.retention.check.interval" $Kafka_Home/config/server.properties
Colin
2
Я хотел отредактировать ответ, так как в первой команде есть небольшая ошибка. Но редактирование одного символа не допускается. На самом деле это не --add configтак--add-config
SRC
7

Мы попробовали в значительной степени то, что описывают другие ответы, с умеренным уровнем успеха. Что действительно сработало для нас (Apache Kafka 0.8.1), так это команда класса

sh kafka-run-class.sh kafka.admin.DeleteTopicCommand --topic yourtopic --zookeeper localhost: 2181

Дэн М
источник
2
Пробовал в 0.8.1. Команда возвращает "удаление выполнено успешно!" однако он не удаляет разделы внутри папок журналов.
dilm 09
8
Пробовал 0.8.2.1 (доморощенный), и он дает эту ошибку. Error: Could not find or load main class kafka.admin.DeleteTopicCommand
Thanish
2
В новой версии кафки (0.8.2) это sh kafka-run-class.sh kafka.admin.TopicCommand --delete --topic [topic_for_delete] --zookeeper localhost: 2181. Убедитесь, что delete.topic.enable истинно.
Hoàng Long
3

Для любителей пива

Если вы используете brewкак я и потратили много времени на поиск печально известной kafka-logsпапки, не бойтесь больше. (и, пожалуйста, дайте мне знать, работает ли это для вас и нескольких разных версий Homebrew, Kafka и т. д. :))

Вы, вероятно, найдете его в:

Место расположения:

/usr/local/var/lib/kafka-logs


Как на самом деле найти этот путь

(это также полезно практически для каждого приложения, которое вы устанавливаете через brew)

1) brew services list

kafka запустил matbhz /Users/matbhz/Library/LaunchAgents/homebrew.mxcl.kafka.plist

2) Откройте и прочтите то, что plistвы нашли выше

3) Найдите строку, определяющую server.propertiesместоположение, откройте ее, в моем случае:

  • /usr/local/etc/kafka/server.properties

4) Ищите log.dirsстроку:

log.dirs = / usr / local / var / lib / kafka-журналы

5) Перейдите в это место и удалите журналы по темам, которые вам нужны.

6) Перезапустите Kafka с помощью brew services restart kafka

Матеус Фелипе
источник
2

Все данные о темах и их разделах хранятся в tmp/kafka-logs/. Более того, они хранятся в формате topic-partionNumber, поэтому, если вы хотите удалить тему newTopic, вы можете:

  • стоп кафка
  • удалить файлы rm -rf /tmp/kafka-logs/newTopic-*
Сальвадор Дали
источник
1
  1. Остановите ZooKeeper и Kafka
  2. В server.properties измените значение log.retention.hours. Вы можете комментировать log.retention.hoursи добавлять log.retention.ms=1000. Это сохранит запись на Kafka Topic только одну секунду.
  3. Запустите zookeeper и kafka.
  4. Проверьте на потребительской консоли. Когда я впервые открыл консоль, там была запись. Но когда я снова открыл консоль, запись была удалена.
  5. Позже вы можете установить log.retention.hoursжелаемое значение.
граф
источник
1

Начиная с версии kafka 2.3.0, есть альтернативный способ мягкого удаления Kafka (старый подход устарел).

Обновите retention.ms до 1 секунды (1000 мс), затем снова установите его через минуту, до значения по умолчанию, то есть 7 дней (168 часов, 604 800 000 в мс)

Мягкое удаление: - (rentention.ms = 1000) (с использованием kafka-configs.sh)

bin/kafka-configs.sh --zookeeper 192.168.1.10:2181 --alter --entity-name kafka_topic3p3r --entity-type topics  --add-config retention.ms=1000
Completed Updating config for entity: topic 'kafka_topic3p3r'.

Установка по умолчанию: - 7 дней (168 часов, retention.ms = 604800000)

bin/kafka-configs.sh --zookeeper 192.168.1.10:2181 --alter --entity-name kafka_topic3p3r --entity-type topics  --add-config retention.ms=604800000
Brajkishore Dubey
источник
0

При ручном удалении темы из кластера kafka вы можете просто проверить это https://github.com/darrenfu/bigdata/issues/6 . Важный шаг, который часто упускается в большинстве решений, заключается в удалении /config/topics/<topic_name>в ZK.

Абдуррахман Адебийи
источник
0

Я использую этот скрипт:

#!/bin/bash
topics=`kafka-topics --list --zookeeper zookeeper:2181`
for t in $topics; do 
    for p in retention.ms retention.bytes segment.ms segment.bytes; do
        kafka-topics --zookeeper zookeeper:2181 --alter --topic $t --config ${p}=100
    done
done
sleep 60
for t in $topics; do 
    for p in retention.ms retention.bytes segment.ms segment.bytes; do
        kafka-topics --zookeeper zookeeper:2181 --alter --topic $t --delete-config ${p}
    done
done
Дмитрий Шепелев
источник
0

Я использую указанную ниже утилиту для очистки после запуска интеграционного теста.

Он использует последнюю AdminZkClientверсию api. Старый API устарел.

import javax.inject.Inject
import kafka.zk.{AdminZkClient, KafkaZkClient}
import org.apache.kafka.common.utils.Time

class ZookeeperUtils @Inject() (config: AppConfig) {

  val testTopic = "users_1"

  val zkHost = config.KafkaConfig.zkHost
  val sessionTimeoutMs = 10 * 1000
  val connectionTimeoutMs = 60 * 1000
  val isSecure = false
  val maxInFlightRequests = 10
  val time: Time = Time.SYSTEM

  def cleanupTopic(config: AppConfig) = {

    val zkClient = KafkaZkClient.apply(zkHost, isSecure, sessionTimeoutMs, connectionTimeoutMs, maxInFlightRequests, time)
    val zkUtils = new AdminZkClient(zkClient)

    val pp = new Properties()
    pp.setProperty("delete.retention.ms", "10")
    pp.setProperty("file.delete.delay.ms", "1000")
    zkUtils.changeTopicConfig(testTopic , pp)
    //    zkUtils.deleteTopic(testTopic)

    println("Waiting for topic to be purged. Then reset to retain records for the run")
    Thread.sleep(60000L)

    val resetProps = new Properties()
    resetProps.setProperty("delete.retention.ms", "3000000")
    resetProps.setProperty("file.delete.delay.ms", "4000000")
    zkUtils.changeTopicConfig(testTopic , resetProps)

  }


}

Есть возможность удалить тему. Но он отмечает тему для удаления. Позже Zookeeper удалит тему. Поскольку это может быть непредсказуемо долго, я предпочитаю подход retention.ms

ForeverLearner
источник