我在本地做kafka的producer调试,每隔一段时间后,所使用的topic管道就会堆积数据,而且我这边使用的是  kafka   bin 下的consumer命令单独消费的,每次都是  --from-beginning,,启动后有一堆数据,感觉麻烦,,,所幸抽出点时间来,,看看怎么干掉他
 
下边来看俩种常见的方法:见下文!
-----------------------------------------------------------------------------------------------------------------------------------------
 kafka删除topic的方法

2014-09-02 22:50:54

标签:kafka 删除topic
原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 、作者信息和本声明。否则将追究法律责任。http://caiguangguang.blog.51cto.com/1652935/1548069

0.8的官方文档提供了一个删除topic的命令:

kafka-topics.sh --delete 但是在运行时会报错找不到这个方法。

kafka-topics.sh最终是运行了kafka.admin.TopicCommand这个类,在0.8的源码中这个类中没有找到有delete topic相关的代码。

在kafka的admin包下,提供了一个DeleteTopicCommand的类,可以实现删除topic的功能。

kafka.admin.DeleteTopicCommand

其中删除topic的具体实现代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
import org.I0Itec.zkclient.ZkClient
import kafka.utils.{Utils, ZKStringSerializer, ZkUtils}
.......
    val topic = options.valueOf(topicOpt)
    val zkConnect = options.valueOf(zkConnectOpt)
    var zkClient: ZkClient = null
    try {
      zkClient = new ZkClient(zkConnect, 3000030000, ZKStringSerializer)
      zkClient.deleteRecursive(ZkUtils.getTopicPath(topic))  //其实最终还是通过删除zk里面对应的路径来实现删除topic的功能
      println("deletion succeeded!")
    }
    catch {
      case e: Throwable =>
        println("delection failed because of " + e.getMessage)
        println(Utils.stackTrace(e))
    }
    finally {
      if (zkClient != null)
        zkClient.close()
    }

因为这个命令只会删除zk里面的信息,真实的数据还是没有删除,所以需要登录各个broker,把对应的topic的分区数据目录删除,也可能正因为这一点,delete命令才没有集成到kafka.admin.TopicCommand这个类。

本文出自 “菜光光的博客” 博客,请务必保留此出处http://caiguangguang.blog.51cto.com/1652935/1548069

-------------------------------------------------------------------------------------------------------------------------------

  1,说起来   kafka  的  topic  的相关命令  没有几个,创建create ,列举所有list,查看指定describe,删除delete,修改alter....
   在kafka的bin下 运行topic 的脚本,之后加关键字  就可以操作了,,,下边看下我本地的操作!
   pwd      /home/wgj/kafka/kafka_2.11-0.9.0.1/bin
  
  创建主题 :./kafka-topics.sh --zookeeper 192.165.1.91:12181,192.165.1.92:12181,192.165.1.64:12181  --create --topic test5 --partitions 2 --replication-factor 2 (--config x=y 括号里边是说你可以用这种方式自定义配置) 
  列举所有主题: ./kafka-topics.sh   --list  --zookeeper 192.165.1.91:12181,192.165.1.92:12181,192.165.1.64:12181
  查看指定主题: ./kafka-topics.sh   --describe  --zookeeper 192.165.1.91:12181,192.165.1.92:12181,192.165.1.64:12181 --topic test5
  修改指定主题: ./kafka-topics.sh  --zookeeper 192.165.1.91:12181,192.165.1.92:12181,192.165.1.64:12181 --alter --topic test5 --delete   --Config  topic=test4
  本来是没有删除命令的,但是在0.8版本后,0.8的官方文档提供了一个删除topic的命令:

  kafka-topics.sh --delete    但是在运行时会报错找不到这个方法。

kafka-topics.sh最终是运行了kafka.admin.TopicCommand这个类,在0.8的源码中这个类中没有找到有delete topic相关的代码。

  在kafka的admin包下,提供了一个DeleteTopicCommand的类,可以实现删除topic的功能。

kafka.admin.DeleteTopicCommand

  其中删除topic的具体实现代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
import org.I0Itec.zkclient.ZkClient
import kafka.utils.{Utils, ZKStringSerializer, ZkUtils}
.......
    val topic = options.valueOf(topicOpt)
    val zkConnect = options.valueOf(zkConnectOpt)
    var zkClient: ZkClient = null
    try {
      zkClient = new ZkClient(zkConnect, 3000030000, ZKStringSerializer)
      zkClient.deleteRecursive(ZkUtils.getTopicPath(topic))  //其实最终还是通过删除zk里面对应的路径来实现删除topic的功能
      println("deletion succeeded!")
    }
    catch {
      case e: Throwable =>
        println("delection failed because of " + e.getMessage)
        println(Utils.stackTrace(e))
    }
    finally {
      if (zkClient != null)
        zkClient.close()
    }

因为这个命令只会删除zk里面的信息,真实的数据还是没有删除,所以需要登录各个broker,把对应的topic的分区数据目录删除,也可能正因为这一点,delete命令才没有集成到kafka.admin.TopicCommand这个类。

   即删除指定主题: ./kafka-topics.sh    --zookeeper 192.165.1.91:12181,192.165.1.92:12181,192.165.1.64:12181 --topic test5  --delete  
  之后手动删除kafka topic   如果topic没能成功被删除(比如broker挂掉等)可以用以下方式手动清理
   (当然,也可以重启zk和broker;这样当broker正确注册上zk试,被mark delete的topic会被自动清理掉)
 
===============停止kafka,保持zookeeper仍旧运行======================================

在zookeeper上删除数据:用zookeeper客户端zkClient连接zookeeper,如:

./zkCli.sh -server 192.165.1.91:12181    此处最好只连接本机的zookeeper:端口,即在集群中每台机器上单独操作!!!

连接上后,可以用命令查看zk的目录结构

ls /brokers/topics

然后可以看到该目录下有test5目录     tab 补全   ls   发现下边有 (0,1) 字样   ,这是说test5 有俩个分区   然后以以下方式层层递减删除他...

删除方式:
delete /brokers/topics/test5/partitions/0/state
delete /brokers/topics/test5/partitions/1/state
delete /brokers/topics/test5/partitions/0
delete /brokers/topics/test5/partitions/1
delete /brokers/topics/test5/partitions
delete /brokers/topics/test5

===========停止kafka和zookeeper========================

a.查看server.properties中配置的log.dirs路径
b.进入到此路径中(如果kafka是一个集群,需要在每台机器上执行)
ls    我的topic 太多了   贴个图片大家看下

假定要删除的topic名称叫做:test5

则rm -rf test5-*

vi replication-offset-checkpoint
原文为:

像我本地,是要全都删除的,直接改为:

 0
 0
 -------你们的话,就把你们对应的的topic相关 删除就好了,,,见上边截图,,,我需要删test5 0 6678 该行起到  __consumer_offsets 22 0  结束,还需要把  test5 的1标志分区 也删掉   即 test5 1 0 这行,
vi recovery-point-offset-checkpoint
同理修改

===========启动kafka和zookeeper========================此时,已修改好;

创建集群的时候要注意:kafka的日志清理

kafka将会保留所有发布的消息,不论他们是否被消费过
如果需要清理,则需要进行配置;
server.properties配置:

log.cleanup.policy=delete
日志清理策略

log.retention.hours=168        (即7天)
数据存储的最大时间超过这个时间会根据log.cleanup.policy设置的策略处理数据,也就是消费端能够多久去消费数据
log.retention.bytes和log.retention.minutes任意一个达到要求,都会执行删除

log.retention.bytes=-1
topic每个分区的最大文件大小
一个topic的大小限制=分区数*log.retention.bytes
-1表示没有大小限制
log.retention.bytes和log.retention.minutes任意一个达到要求,都会执行删除

log.retention.check.interval.ms=5minutes
文件大小检查的周期时间

3.kafka的分布式

一个日志的多个partition被分散在kafka集群的多个server上,并且每一个server处理来自于某个partition的数据请求。每个partition可以配置副本个数(即备份),以便容错。
(注:在创建topic时,可以指定--replication-factor参数)

每个partition都有一个server作为leader,并且有0或者多个server作为followers。leader处理对于这个partition的所有读写请求,而followers则被动的复制一切。如果leader挂掉了,一个followers则会自动的成为新的leader。每个server都会在某些partition上作为leader,而在另一些partition上作为follower,所以整个集群是非常平衡的。
(注:如果topic的repliation配置为1,则每个partition就只有唯一的一个leader,没有follower;所以要保证容错性,至少replication应该配置为2)这块我还没有闹懂,我现在的程序中是没有备份的,在另外一套系统中跑的程序入库,,然后另一套做实时展示计算;

4.kafka 的负载均衡问题   producer操作的时候,最好使用轮询的方式向topic写数据,保证topic每个partition的负载是均衡的,之前用的是默认的(随机算法),我现场用的是俩个分区,三台机器组成一个集群,结果一台机器的一个分区里边已经有10亿条数据了,集群中的另一台机器的分区中才只有8亿多一点,,,所以说最好用轮询,也有用hash的,但是为了负载均衡保证消费的高可用,(现场消费一般都是分组消费,consumer在消费的时候一般都是均衡的在broker上去取数据),,所以我个人极力鼓励用轮询来处理数据的分区的问题;省事,安全,不用去考虑负载不均衡带来的其他问题.

kafka删除topic的方法及我在kafka上边的一些经验的更多相关文章

  1. kafka 删除topic清空数据

    原 kafka 删除topic清空数据 2018年11月20日 18:17:50 Ming! 阅读数:1391   版权声明:版权声明:本文为博主原创文章,未经博主允许不得转载. https://bl ...

  2. kafka删除topic及其相关数据

    1.删除kafka存储目录(server.properties文件log.dirs配置,默认为"/tmp/kafka-logs")相关topic目录 2.Kafka 删除topic ...

  3. kafka 删除topic

    两种方法: 一.修改配置文件server.properties 添加如下配置: delete.topic.enable=true 说明:官方给的文档说明“Enables delete topic. D ...

  4. kafka删除topic详解

    1.删除topic命令 bin/kafka-topics.sh --delete --zookeeper 192.168.242.131:2181 --topic aaa 注:此命令如果要生效,还需在 ...

  5. kafka删除topic数据

    一.概述 生产环境中,有一个topic的数据量非常大.这些数据不是非常重要,需要定期清理. 要求:默认保持24小时,某些topic 需要保留2小时或者6小时 二.清除方式 主要有3个: 1. 基于时间 ...

  6. kafka删除topic中的数据,适用于比较高的版本

    server.properties中增加选项 delete.topic.enable=true 修改之后重启kafka 进入kafka目录,输入命令 bin/kafka-topics.sh --zoo ...

  7. Kafka:ZK+Kafka+Spark Streaming集群环境搭建(十一)定制一个arvo格式文件发送到kafka的topic,通过Structured Streaming读取kafka的数据

    将arvo格式数据发送到kafka的topic 第一步:定制avro schema: { "type": "record", "name": ...

  8. kafka删除topic

    手动: 删除kafka存储目录(server.properties文件log.dirs配置,默认为"/tmp/kafka-logs")相关topic目录 删除zookeeper & ...

  9. kafka删除topic后再创建同名的topic报错(ERROR org.apache.kafka.common.errors.TopicExistsException)

    [hadoop@datanode3 logs]$ kafka-topics.sh --delete --zookeeper datanode1:2181 --topic firstTopic firs ...

随机推荐

  1. 使用Prism提供的类实现WPF MVVM点餐Demo

    使用Prism提供的类实现WPF MVVM点餐Demo 由于公司开发的技术需求,近期在学习MVVM模式开发WPF应用程序.进过一段时间的学习,感受到:学习MVVM模式,最好的方法就是用MVVM做几个D ...

  2. 安装SQL Server 2005 - 初学者系列 - 学习者系列文章

    初学者阶段,建议从数据库为基础入手进行学习. 下面介绍微软的SQL Server 2005数据库的安装. 首先,从下列地址获取SQL Server 2005的安装程序. ed2k://|file|cs ...

  3. MEF高级进阶

    MEF高级进阶   好久没有写博客了,今天抽空继续写MEF系列的文章.有园友提出这种系列的文章要做个目录,看起来方便,所以就抽空做了一个,放到每篇文章的最后. 前面四篇讲了MEF的基础知识,学完了前四 ...

  4. .9 png图片的制作

    在android开发的过程中我们经常因为没有好的美工图片失真,这样使界面看起来要逊色很多,有的时候可能我们会想在drawable-hdpi,ldpi,mdpi下放不同分辨率的图片,这样虽然可以有效避免 ...

  5. 利用Delphi监视注册表的变化

    转帖:利用Delphi监视注册表的变化 2009-12-23 11:53:51 分类: 利用Delphi监视注册表的变化       我们在编写软件的时候,常常需要把一些信息保存到系统的注册表中.如果 ...

  6. BrnShop:自定义插件

    BrnShop开源网上商城第四讲:自定义插件 重要通知:BrnShop企业版NOSQL设计(基于Redis)已经开源!源码内置于最新版的BrnShop中,感兴趣的园友可以去下载来看看.官网地址:www ...

  7. valuechange(动态的监听input,textarea)

    valuechange(动态的监听input,textarea)之前值,之后值的变化 jQuery封装自定义事件--valuechange(动态的监听input,textarea)之前值,之后值的变化 ...

  8. .net平台下socket异步通讯(代码实例)

    你应该知道的.net平台下socket异步通讯(代码实例) 1,首先添加两个windows窗体项目,一个作为服务端server,一个作为客户端Client 2,然后添加服务端代码,添加命名空间,界面上 ...

  9. Day1:T1 模拟 T2 拓扑排序

    T1:模拟 自己第一天的简直跟白痴一样啊...模拟都会打错.. 当时貌似在更新最大值的时候打逗比了... if((sum[x]==max && x<maxh) || sum[x] ...

  10. Android JNI(NDK)开发总结

    早就知道Java有个jni可以调用本地化代码,一直没有动力去研究它,现在公司想通过在Android中调用本地化代码来申请较多的内存以突破Android对单个进程的内存限制,这确实是可行的:我的Nexu ...