(1)查看当前服务器中的所有 topic
bin/kafka-topics.sh --zookeeper hadoop100:2181 --list
目前没有主题,所以没有输出,下面我们创建一个主题
(2)创建通topic
bin/kafka-topics.sh --zookeeper hadoop100:2181 --create --replication-factor 1 --partitions 2 --topic first
选项说明:
--topic 定义 topic 名
--replication-factor 定义副本数
--partitions 定义分区数
主题创建成功
再看一下存放kafka消息的文件夹data:
存放kafka消息的文件命名方式为topic主题名 + -分区号
通过,之前的命令,我们创建了topic名为first,副本数为1(即本身)分区数为2的主题,与文件显示一致
(3)删除topic
注:此操作需要在server.properties中将设置delete.topic.enable=true,否则就只是标记删除,而不会真正删除
bin/kafka-topics.sh --zookeeper hadoop100:2181 --delete --topic first
删除成功
(4)发送消息
bin/kafka-console-producer.sh --broker-list hadoop100:9092 --topic first
(5)消费消息
3种消费消息的方式
新建一个会话:
①zookeeper存放数据
bin/kafka-console-consumer.sh --zookeeper hadoop100:2181 --topic first
插入成功
②本地存放数据
注:第一个方法发出了警报:
Using the ConsoleConsumer with old consumer is deprecated and will be removed in a future major release. Consider using the new consumer by passing [bootstrap-server] instead of [zookeeper].
在之前的博客最后提到过:
在这里也体现出来了,就是上一个方法那消息是过时的方法,然后提示我们要加bootstrap-server参数
所以第二种消费方式为:
bin/kafka-console-consumer.sh --bootstrap-server hadoop100:9092 --topic first
成功接收到新消息
③读取历史消息
我们发现新建的消费者只能读取创建之后的消息,那么如何读取创建前的消息呢?
bin/kafka-console-consumer.sh --bootstrap-server hadoop100:9092 --from-beginning --topic first
添加--from-beginning 参数会把主题中以往所有的数据都读取出来
成功读取到之前的数据
我们发现虽然数据都读到了,但是顺序不一样
特别注意:
当使用--bootstrap-server参数时,数据存到本地,kafka会在data目录创建50个分区来存放数据,如果是有多个集群则会轮询的创建
查看first主题第一个分区,有log和index两个文件
“ .index ”文件存储大量的索引信息,“ .log ”文件存储大量的数据 ,索引文件中的元数据指向对应数据文件中 message 的物理偏移地址。
我们可以发现index只存数据的索引,而log只存消息,而kafka的消息都是顺序的,所以可以大大减小kafka拿到数据的时间,因为我只要知道是第几个顺序,通过index可以直接拿到对应消息的起始位置,就可以直接拿到该数据了。
(6)消费者组
1、复制一份config目录下consumer.properties文件
将group id改为消费者组的名称:
2、 开启一个消费者组时加入配置信息
bin/kafka-console-consumer.sh --zookeeper hadoop100:2181 --topic first --consumer.config config/consumer.properties
同一个配置文件开启的消费者就在一个消费者组中,但若消费者组中消费者的数量大于分区数的话会报提醒
(7)查看topic的详情
bin/kafka-topics.sh --zookeeper hadoop100:2181 --describe --topic first
查看first主题的详情