Kafka 搭建与常用命令(增、删、查)

Kafka官网:Apache Kafka

Kafka作用:削峰,蓄水池,离线处理(例:日志数据采集:flume->kafka->hdfs),实时处理(例:数据传输到kafka->对接flink、sparkstreaming)

顺序保证:
Kafka可以保证同一个分区里的消息是有序的。考虑一种情况,如果retries为非零整数,同时max.in.flight.requests.per.connection为比1大的数如果某些场景要求消息是有序的,也即生产者在收到服务器响应之前可以发送多个消息,且失败会重试。那么如果第一个批次消息写入失败,而第二个成功,Broker会重试写入第一个批次,如果此时第一个批次写入成功,那么两个批次的顺序就反过来了。也即,要保证消息是有序的,消息是否写入成功也是很关键的。那么如何做呢?在对消息的顺序要严格要求的情况下,可以将retries设置为大于0,max.in.flight.requests.per.connection设为1,这样在生产者尝试发送第一批消息时,就不会有其他的消息发送给Broker。当然这回严重影响生产者的吞吐量。

下载好kafka安装包后解压进行配置

1.修改server.properties中的

linux>vi server.properties
broker.id=0
log.dirs=/var/kafka-logs
zookeeper.connect=two:2181,three:2181,four:2181

下发文件

linux>scp -r kafka  AIP@`pwd`
linux>scp -r kafka  BIP@`pwd`
linux>scp -r kafka  CIP@`pwd`


2.分发到各个节点,修改broker.id

linuxB>vi server.properties

broker.id=1

linuxC>vi server.properties

broker.id=2


3.编写启动脚本

linux>vi start-kafka.sh
nohup bin/kafka-server-start.sh config/server.properties > kafka.log 2>&1 &


4运行启动脚本

linux>chmod +x start-kafka.sh
#将启动脚本下发至其他kafka服务器
linux>scp start-kafka.sh BIP@`pwd`
linux>scp start-kafka.sh CIP@`pwd`
linux>./start-kafka.sh    #//每台kafka服务器都执行

linux>jps    #//查看进行 有没有kafka

安装好后 zookeeper里就有相应的目录bin/zkCli.sh 进入客户端

5.常用命令

--zookeeper  : 是旧版Kafka的参数(v2.8以前)
--bootstrap.server : 新版Kafka的参数。Kafka开发团队重写了ZooKeeper的Quorum控制器代码并嵌入到Kafka中。所以从v2.8版本开始,Kafka不再依赖ZooKeeper。(bootstrap.servers参数,只在启动客户端连接Kafka服务时使用。并且,即使列表里面填了多个节点,只要有一个可用就行了。)

创建一个叫test的话题,有3个分区,每个分区3个副本:

linux>bin/kafka-topics.sh  --zookeeper A:2181,B:2181,C:2181 --create -topuc test -partitions 3(几个分区) -replication-factor 3(几个备份)

启动kafka服务

linux>bin/kafka-server-start.sh config/server.properties &


停止kafka服务

linux>./kafka-server-stop.sh 

查看所有的话题

linux>./kafka-topics.sh --list --zookeeper A:9092

查看所有话题的详细信息

linux>./kafka-topics.sh --zookeeper localhost:2181 --describe

列出指定话题的详细信息

linux>./kafka-topics.sh --zookeeper localhost:2181 --describe  --topic test

删除一个话题

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

测试kafka发送和接收消息(启动两个终端)

#发送消息(注意端口号为配置文件里面的端口号)
./kafka-console-producer.sh --broker-list localhost:9092 --topic test
#消费消息(可能端口号与配置文件保持一致,或与发送端口保持一致)
./kafka-console-consumer.sh --bootstrap-server localhost:9092 --topic test --from-beginning   #加了--from-beginning 重头消费所有的消息
./kafka-console-consumer.sh --bootstrap-server localhost:9092 --topic test         #不加--from-beginning 从最新的一条消息开始消费

查看某个topic对应的消息数量

linux>./kafka-run-class.sh  kafka.tools.GetOffsetShell --broker-list localhost:9092 --topic test --time -1

显示所有消费者

linux>./kafka-consumer-groups.sh --bootstrap-server localhost:9092 --list

获取正在消费的topic(console-consumer-63307)的group的offset

linux>./kafka-consumer-groups.sh --describe --group console-consumer-63307 --bootstrap-server localhost:9092

显示消费者

linux>./kafka-consumer-groups.sh --bootstrap-server localhost:9092 --list

config.storage.topic(default connect-configs):用以保存connector和task的配置信息,需要注意的是这个主题的分区数只能是1,而且是有多副本的。(推荐partition 1,replica 3)
offset.storage.topic(default connect-offsets):用以保存offset信息。(推荐partition50,replica 3)
status.storage.topic(default connect-status):用以保存connetor的状态信息。(推荐partition10,replica 3)
注意:kafka版本不同,中间的命令不同如下

【命令1】$bin/kafka-topics.sh --create --zookeeper A:2181,B:2181,C:2181 --replication-factor 1 --partitions 10 --topic connect-status

【命令2】$bin/kafka-topics.sh --bootstrap-server A:9092,B:9092,C:9092 --create -topic connect-offsets2   --partitions 20 --replication-factor 3

新版本的一些命令

查看创建的topics

linux>bin/kafka-topics.sh --list  --bootstrap-server A:9092

所有分组消费情况

linux>kafka-consumer-groups.sh --bootstrap-server A:9092 --describe --all-groups

topics-添加分区

linux>bin/kafka-topics.sh --bootstrap-server broker_host:port --alter --topic my_topic_name \ --partitions 40

删除topics配置

linux>bin/kafka-configs.sh --bootstrap-server broker_host:port --entity-type topics --entity-name my_topic_name --alter --delete-config x

注意:

停止connect 和kafka 
删掉 kafka-logs内的数据
删掉zookeeper内的数据,如果zookeeper内数据没有清理干净,如/config/topics下存在数据,启动kafka会自动恢复topic
在zookeeper上删
zookeeper 里 删除 : /config/topics/topic_name, /brokers/topics/topic_name, /admin/topic_name

step1:
如果需要被删除topic 此时正在被程序 produce和consume,则这些生产和消费程序需要停止。
因为如果有程序正在生产或者消费该topic,则该topic的offset信息一致会在broker更新。调用kafka delete命令则无法删除该topic。
同时,需要设置 auto.create.topics.enable = false,默认设置为true。如果设置为true,则produce或者fetch 不存在的topic也会自动创建这个topic。这样会给删除topic带来很多意向不到的问题。
所以,这一步很重要,必须设置auto.create.topics.enable = false,并认真把生产和消费程序彻底全部停止。


step2:
server.properties 设置 delete.topic.enable=true
如果没有设置 delete.topic.enable=true,则调用kafka 的delete命令无法真正将topic删除,而是显示(marked for deletion)


step3:
调用命令删除topic:
./bin/kafka-topics --delete --zookeeper 【zookeeper server:port】 --topic 【topic name】


step4:
删除kafka存储目录(server.properties文件log.dirs配置,默认为"/data/kafka-logs")相关topic的数据目录。
注意:如果kafka 有多个 broker,且每个broker 配置了多个数据盘(比如 /data/kafka-logs,/data1/kafka-logs ...),且topic也有多个分区和replica,则需要对所有broker的所有数据盘进行扫描,删除该topic的所有分区数据。


step5:
找一台部署了zk的服务器,使用命令:
bin/zkCli.sh -server 【zookeeper server:port】
登录到zk shell,然后找到topic所在的目录:ls /brokers/topics,找到要删除的topic,然后执行命令:
rmr /brokers/topics/【topic name】
即可,此时topic被彻底删除。
如果topic 是被标记为 marked for deletion,则通过命令 ls /admin/delete_topics,找到要删除的topic,然后执行命令:
rmr /admin/delete_topics/【topic name】
备注:
网络上很多其它文章还说明,需要删除topic在zk上面的消费节点记录、配置节点记录,比如:
rmr /consumers/【consumer-group】
rmr /config/topics/【topic name】
其实正常情况是不需要进行这两个操作的,如果需要,那都是由于操作不当导致的。比如step1停止生产和消费程序没有做,step2没有正确配置。也就是说,正常情况下严格按照step1 -- step5 的步骤,是一定能够正常删除topic的。


step6:
完成之后,调用命令:
./bin/kafka-topics.sh --list --zookeeper 【zookeeper server:port】
查看现在kafka的topic信息。正常情况下删除的topic就不会再显示。
但是,如果还能够查询到删除的topic,则重启zk和kafka即可。

删除topic

linux>bin/kafka-topics.sh --bootstrap-server A:9092,B:9092,C:9092 --delete --topic  my_topic

同时删除多个topic
可以同时删除多个topic,用逗号分隔

linux>bin/kafka-topics.sh --bootstrap-server A:9092,B:9092,C:9092 --delete --topic AA,BB

删除所有的topic (慎用)

linux>bin/kafka-topic.sh –bootstrap-server A:9092,B:9092,C:9092  --delete –topic “.*?”

删除已xxx为开头的topic

linux>bin/kafka-topic.sh –bootstrap-server A:9092,B:9092,C:9092  --delete –topic “XXX.*”

相关配置:
delete.topic.enable  是否可以删除topic
file.delete.delay.ms    topic 删除被标记为delete 文件之后延迟多长时间删除真正的log文件  默认 60000 (1分钟)

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值