有没有一种方法可以删除主题中的所有数据或在每次运行之前删除该主题?


87

有没有一种方法可以删除主题中的所有数据或在每次运行之前删除该主题?

我可以修改KafkaConfig.scala文件以更改logRetentionHours属性吗?消费者阅读消息后,有没有办法删除消息?

我正在使用生产者从某个地方获取数据,并将数据发送到消费者消费的特定主题,我是否可以在每次运行时删除该主题中的所有数据?每次在该主题中我只需要新数据。有没有办法以某种方式重新初始化主题?


Answers:


62

尚不支持。查看此JIRA问题“添加删除主题支持”。

手动删除:

  1. 关闭集群
  2. 清除kafka日志目录(由log.dirkafka配置文件中的属性指定)以及zookeeper数据
  3. 重新启动集群

对于任何给定的主题,您可以做的是

  1. 停止卡夫卡
  2. 清洁卡夫卡日志具体到分区,卡夫卡存储在“LOGDIR /主题分区”所以对于一个名为“MyTopic”的日志分区ID 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群集将所有已发布的消息(无论是否已被使用)保留一段可配置的时间。例如,如果日志保留时间设置为两天,则在消息发布后的两天内,该消息可供使用,之后将被丢弃以释放空间。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];
}

我相信与JIRA问题的正确链接是issues.apache.org/jira/browse/KAFKA-330
asmaier 2013年

4
该主题仍将显示在此处,因为它已在zookeeper中列出。您必须递归删除所有内容brokers/topics/<topic_to_delete>以及日志以摆脱它。
SubmittedDenied

3
根据问题链接,您可以在0.8.1版之后删除主题。您可以通过查看详细帮助kafka-run-class.sh kafka.admin.DeleteTopicCommand
2014年

5
更新:从kafka 0.8.2开始,命令更改为:kafka-run-class.sh kafka.admin.TopicCommand --delete --topic [topic_to_delete] --zookeeper localhost:2181
杰伊·泰勒

我认为现在已添加此启用主题删除功能。下一个稳定版本可能会包含它。
ha9u63ar 2015年

70

正如我在这里提到的,清除Kafka队列

在Kafka 0.8.2中进行了快速入门示例的测试:首先,在config文件夹下的server.properties文件中添加一行:

delete.topic.enable=true

然后,您可以运行以下命令:

bin/kafka-topics.sh --zookeeper localhost:2181 --delete --topic test

2
顺便说一句,如果有人怀疑,您无需在添加选项后重新启动Kafka服务器。
问题人员

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
colin

2
我想编辑答案,因为第一个命令中有一个小错误。但不允许编辑一个字符。其实不是,--add config而是--add-config
SRC,

7

我们几乎尝试了其他答案所描述的中等成功水平。对我们真正有用的(Apache Kafka 0.8.1)是类命令

sh kafka-run-class.sh kafka.admin.DeleteTopicCommand --topic yourtopic --zookeeper本地主机:2181


2
在0.8.1中进行了尝试。该命令返回“删除成功!” 但是,它不会删除日志文件夹内的分区。
迪尔姆

8
尝试使用0.8.2.1(自制软件),并且出现此错误。Error: Could not find or load main class kafka.admin.DeleteTopicCommand
Thanish 2015年

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 /用户/ matbhz /图书馆/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 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秒(1000ms),然后在一分钟后将其重新设置为默认设置,即7天(168小时,604,800,000以ms为单位)

软删除 :-(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稍后删除该主题。由于这可能会很长,所以我更喜欢采用tention.ms方法

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.