有没有办法在每次运行之前删除主题中的所有数据或删除主题?

时间:2013-07-18 18:08:10

标签: apache-kafka apache-zookeeper

有没有办法在每次运行之前删除主题中的所有数据或删除主题?

我可以修改KafkaConfig.scala文件来更改logRetentionHours属性吗?一旦消费者阅读消息,是否有消息被删除的方式?

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

13 个答案:

答案 0 :(得分:50)

不要认为它已被支持。看看这个JIRA issue“添加删除主题支持”。

手动删除:

  1. 关闭群集
  2. 清理kafka日志目录(由kafka config文件中的log.dir属性指定)以及zookeeper数据
  3. 重新启动群集
  4. 对于任何给定的主题,您可以做的是

    1. 停止kafka
    2. 清除特定于分区的kafka日志,kafka以“logDir / topic-partition”格式存储其日志文件,因此对于名为“MyTopic”的主题,分区ID为0的日志将存储在/tmp/kafka-logs/MyTopic-0其中/tmp/kafka-logslog.dir属性
    3. 指定
    4. 重新启动kafka
    5. 这是NOT一个很好的推荐方法,但它应该有效。 在Kafka代理配置文件中,log.retention.hours.per.topic属性用于定义The number of hours to keep a log file before deleting it for some specific topic

        

      此外,消费者在阅读消息后是否有消息被删除的方式?

      来自Kafka Documentation

        

      Kafka群集保留所有已发布的消息 - 无论是否已被消费 - 在可配置的时间段内。例如,如果将日志保留设置为两天,那么在发布消息后的两天内,它可供消费,之后将被丢弃以释放空间。 Kafka的性能在数据大小方面实际上是恒定的,因此保留大量数据不是问题。

           

      事实上,基于每个消费者保留的唯一元数据是消费者在日志中的位置,称为“偏移”。这种偏移由消费者控制:消费者通常在读取消息时线性地提升其偏移量,但实际上该位置由消费者控制并且它可以按照其喜欢的任何顺序消费消息。例如,消费者可以重置为较旧的偏移量来重新处理。

      为了找到在Kafka 0.8 Simple Consumer example中读取的起始偏移,他们说

        

      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];
      }
      

答案 1 :(得分:47)

正如我在此提到的Purge Kafka Queue

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

delete.topic.enable=true

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

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

答案 2 :(得分:12)

使用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文件夹中删除主题文件夹,那么您将看到主题仍在那里。

答案 3 :(得分:6)

以下是用于清空和删除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

答案 4 :(得分:5)

作为一种肮脏的解决方法,您可以调整每个主题的运行时保留设置,例如bin/kafka-topics.sh --zookeeper localhost:2181 --alter --topic my_topic --config retention.bytes=1 retention.bytes = 0 也可能有效)

过了一会儿,卡夫卡应该释放空间。与重新创建主题相比,不确定这是否有任何影响。

PS。一旦kafka完成清洁,最好将保留设置恢复。

您还可以使用retention.ms来保存历史数据

答案 5 :(得分:5)

我们尝试了其他答案所描述的中等程度的成功。 真正适用于我们的是(Apache Kafka 0.8.1)是类命令

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

答案 6 :(得分:2)

有关主题及其分区的所有数据都存储在tmp/kafka-logs/中。此外,它们以[{1}}格式存储,因此如果您要删除主题topic-partionNumber,您可以:

  • 停止kafka
  • 删除文件newTopic

答案 7 :(得分:2)

适用于酿酒用户

如果您像我一样使用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 /本地的/ var / lib中/卡夫卡-日志

5)转到该位置并删除所需主题的日志

6)用brew services restart kafka

重启Kafka

答案 8 :(得分:1)

  1. 停止ZooKeeper和Kafka
  2. 在server.properties中,更改log.retention.hours值。您可以发表评论log.retention.hours并添加log.retention.ms=1000。它将保持卡夫卡主题的记录只有一秒钟。
  3. 启动zookeeper和kafka。
  4. 检查消费者控制台。当我第一次打开控制台时,记录就在那里。但是当我再次打开控制台时,记录被删除了。
  5. 稍后,您可以将log.retention.hours的值设置为您想要的数字。

答案 9 :(得分: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小时,remaining.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

答案 10 :(得分:0)

在从kafka群集中手动删除主题时,您可以查看https://github.com/darrenfu/bigdata/issues/6 在大多数解决方案中遗漏了很多重要步骤是删除ZK中的/config/topics/<topic_name>

答案 11 :(得分: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

答案 12 :(得分: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稍后删除该主题。由于这可能会长到无法预测的时间,因此我更喜欢采用tention.ms方法