Чи є спосіб видалити всі дані з теми або видалити тему перед кожним запуском?


87

Чи є спосіб видалити всі дані з теми або видалити тему перед кожним запуском?

Чи можу я змінити файл KafkaConfig.scala, щоб змінити logRetentionHoursвластивість? Чи є спосіб видалення повідомлень, як тільки споживач їх прочитає?

Я використовую виробників для отримання даних звідкись і надсилання даних до певної теми, де споживач споживає, чи можу я видалити всі дані з цієї теми при кожному запуску? Я хочу лише нових даних кожного разу в темі. Чи є спосіб якось реініціалізувати тему?


Відповіді:


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. Перезапустіть 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];
}

Я вважаю, що правильним посиланням на проблему JIRA є issues.apache.org/jira/browse/KAFKA-330
asmaier

4
Тема все одно відображатиметься тут, тому що вона перелічена у зоопарку. Вам доведеться рекурсивно видаляти все brokers/topics/<topic_to_delete>, а також журнали, щоб позбутися цього.
SubmittedDenied

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

70

Як я вже згадував тут Черга очищення Кафки :

Протестовано в 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

Перевірено за допомогою kafka 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 також може працювати)

Через деякий час kafka повинен звільнити простір. Не впевнений, чи це має якісь наслідки порівняно з відтворенням теми.

ps. Краще поверніть налаштування утримання назад, як тільки кафка закінчить чистку.

Ви також можете використовувати 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 / topics більше не повинен містити тему:

#!/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
колін

2
Я хотів відредагувати відповідь, оскільки в першій команді є невелика помилка. Але редагування одного символу заборонено. Насправді це не --add configскоріше так--add-config
SRC

7

Ми спробували майже те, що описують інші відповіді, з помірним успіхом. Що нас справді спрацювало (Apache Kafka 0.8.1) - це команда class

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


2
Спробував це в 0.8.1. Команда повертає "видалення вдалося!" однак він не видаляє розділи всередині папок журналу.
dilm

8
Спробував 0.8.2.1 (доморощена мова), і це видає цю помилку. Error: Could not find or load main class kafka.admin.DeleteTopicCommand
Thanish

2
Станом на новий kafka (0.8.2), це sh kafka-run-class.sh kafka.admin.TopicCommand --delete --topic [topic_for_delete] --zookeeper localhost: 2181. Переконайтеся, що delete.topic.enable має значення true.
Хоанг Лонг,

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-logs

5) Перейдіть до цього місця та видаліть журнали тем, які хочете

6) Перезапустіть Kafka with brew services restart kafka


2

Усі дані про теми та їх розділи зберігаються в tmp/kafka-logs/. Крім того, вони зберігаються у форматі topic-partionNumber, тому, якщо ви хочете видалити тему newTopic, ви можете:

  • зупини кафку
  • видалити файли rm -rf /tmp/kafka-logs/newTopic-*

1
  1. Зупиніть ZooKeeper та Кафку
  2. У server.properties змініть значення log.retention.hours. Ви можете коментувати log.retention.hoursта додавати log.retention.ms=1000. Це дозволило б зберегти запис про тему Кафки лише одну секунду.
  3. Почніть охоронця зоопарку та кафки.
  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


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

Я використовую вказану нижче утиліту для очищення після мого тестового запуску інтеграції.

Він використовує останню версію AdminZkClientAPI. Старіша версія 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

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.