Kafka3.x学习记录(一)——集群和命令行操作
对应课程
【尚硅谷】2022版Kafka3.x教程(从入门到调优,深入全面)
消息队列概述
发布/订阅模式:消息的发布者不会将消息直接发送给特定的订阅者,而是将发布的消息分为不同的类别,订阅者只接收感兴趣的消息。
Kafka的定义:Kafka是一个分布式的基于发布/订阅模式的消息队列(Message Queue),主要应用于大数据实时处理领域。
传统的消息队列的应用场景包括:缓存/消峰、解耦和异步通信。
消息队列的两种模式:
![两种模式](https://i-blog.csdnimg.cn/blog_migrate/318659ee7c51f21180346222b5edb544.png#pic_center)
Kafka基础
基础架构
![基础架构](https://i-blog.csdnimg.cn/blog_migrate/a37456ddece8725e9bf6f54d7ec24839.png#pic_center)
- Producer:消息生产者,就是向Kafka broker发送消息的客户端。
- Consumer:消息消费者,向Kafka broker获取消息的客户端。注:生产和消费只针对"Leader"。
- Consumer Group(CG):消费者组,由多个consumer组成。消费者组内每个消费者负责消费不同分区的数据,一个分区只能由一个组内的一个消费者消费;消费者组之间互不影响。所有的消费者都属于某个消费者组,即消费者组是逻辑上的一个订阅者。
- Broker:一台Kafka服务器就是一个broker,一个集群由多个broker组成。一个broker可以容纳多个topic。
- Topic:可以理解成一个队列,生产者和消费者面向的都是一个topic。
- Partition:为了实现扩展性,一个非常大的topic可以分布到多个broker上,一个topic可以分为多个partition,每个partition都是一个有序的队列。
- Replica:副本。一个topic 的每个分区都有若干个副本,一个Leader 和若干个Follower。
- Leader:每个分区多个副本的“主”,生产者发送数据的对象,以及消费者消费数据的对象都是Leader。
- Follower:每个分区多个副本中的“从”,实时从Leader 中同步数据,保持和Leader 数据的同步。Leader 发生故障时,某个Follower 会成为新的Leader。
- Zookeeper:记录了哪些服务器上线了,和一个分区中,谁是"Leader"。
集群部署
官网下载地址:http://kafka.apache.org/downloads.html
目标:将kafka部署到hadoop101,hadoop102和hadoop103上。
将安装包"kafka_2.12-3.0.0.tgz"复制到目录"/opt/software"下,然后解压至"/opt/module"目录下:
tar -zxvf kafka_2.12-3.0.0.tgz -C /opt/module
修改解压后文件的名称:
mv kafka_2.12-3.0.0.tgz/ kafka
进入到配置文件的目录"/opt/module/kafka/config",修改配置文件"server.properties":
vim server.properties
修改三部分内容:
#全局唯一的编号,各个节点不能重复
broker.id=0
#kafka日志存放路径
log.dirs=/opt/module/kafka/datas
#配置连接Zookeeper集群的地址(在zk根目录下创建/kafka,方便管理)
zookeeper.connect=hadoop101:2181,hadoop102:2181,hadoop103:2181/kafka
将kafka包分发至hadoop102和hadoop103上:
scp -r /opt/module/kafka root@192.168.37.102:/opt/module
scp -r /opt/module/kafka root@192.168.37.103:/opt/module
依次,在hadoop102和hadoop103上,修改配置文件"server.properties"的broker.id为1和2。
依次,添加环境变量:
vim /etc/profile
export KAFKA_HOME=/opt/module/kafka
export PATH=$PATH:$KAFKA_HOME/bin
执行环境配置文件(刷新):
source /etc/profile
编写kafka集群统一启动和停止的shell脚本"kf.sh",并放置在/home/user/bin目录下:
#!/bin/bash
case $1 in
"start")
for i in hadoop101 hadoop102 hadoop103
do
echo "--- 启动 $i kafka ---"
sshpass -p 123456 ssh -o StrictHostKeyChecking=no $i "sh /opt/module/kafka/bin/kafka-server-start.sh -daemon /opt/module/kafka/config/server.properties"
done
;;
"stop")
for i in hadoop101 hadoop102 hadoop103
do
echo "--- 停止 $i kafka ---"
sshpass -p 123456 ssh -o StrictHostKeyChecking=no $i "sh /opt/module/kafka/bin/kafka-server-stop.sh"
done
;;
esac
还有集群java进程的显示工具"xcall":
#!/bin/bash
for host in hadoop101 hadoop102 hadoop103
do
echo =============== $host ===============
sshpass -p 123456 ssh -o StrictHostKeyChecking=no $host "/opt/java/jdk/jdk1.8/bin/jps"
done
在目录/home/user下,提升shell脚本的执行权限:
chmod u+x bin/*
启动集群
首先,启动zookeeper集群(Kafka2.8以后无必要)
zk.sh start
再启动kafka集群:
kf.sh start
查看java进程状态:
xcall
[root@hadoop101 ~]# xcall
=============== hadoop101 ===============
3265 QuorumPeerMain
3746 Jps
3654 Kafka
=============== hadoop102 ===============
3632 Kafka
3243 QuorumPeerMain
3707 Jps
=============== hadoop103 ===============
3634 Kafka
3252 QuorumPeerMain
3709 Jps
停止集群的命令如下:
kf.sh stop
Kafka命令行操作
移动至目录"/opt/module/kafka/bin"下,
主题命令行操作
查看操作主题命令行参数:
kafka-topics.sh
查看当前服务器中的所有topic:
kafka-topics.sh --bootstrap-server hadoop101:9092 --list
创建名称为"first"的主题,并指定分区为1,副本为2:
kafka-topics.sh --bootstrap-server hadoop101:9092 --create --partitions 1 --replication-factor 2 --topic first
选项说明:
–topic定义了主题名;–replication-factor定义了副本数;–partitions定义了分区数
查看first主题的详情:
kafka-topics.sh --bootstrap-server hadoop101:9092 --describe --topic first
修改分区数(注意:分区数只能增加,不能减少):
kafka-topics.sh --bootstrap-server hadoop101:9092 --alter --topic first --partitions 3
删除topic操作:
kafka-topics.sh --bootstrap-server hadoop101:9092 --delete --topic first
生产者命令行操作
查看操作生产者命令参数:
kafka-console-producer.sh
向主机hadoop101的主题first中,添加消息:
kafka-console-producer.sh --bootstrap-server hadoop101:9092 --topic first
/> hello
/> world
消费者命令行操作
查看操作消费者命令参数:
kafka-console-consumer.sh
获取first主题的数据:
kafka-console-consumer.sh --bootstrap-server hadoop101:9092 --topic first
把主题中所有的数据读出来(包括:历史数据):
kafka-console-consumer.sh --bootstrap-server hadoop101:9092 --topic first --from-beginning