一、Kafka概述
首先,Kafka 是一个分布式的基于发布/订阅模式的消息队列(Message Queue)具有分布式、高吞吐量、高可用的特点,主要应用于大数据实时处理领域。
此外,Kafka采取的是消费者主动拉取的方式获取数据,至于这样做的好处,上一篇博客 关于消息队列基础 中提到的消息队列的作用之一:削峰。消费者可以根据自己的消费能力主动从消息队列中拉取数据进行消费,而消费者内部需要维持一个长轮询,不断的去访问消息队列中是否由新数据。
其实,发布/订阅模式的消息队列还有一种数据获取方式,就是由消息队列主动推送数据给消费者,这个方式有一个缺点就是不同的消费者可能消费能力不同,对消息队列推送数据的速度要求比较严格。假如消息队列推送速度过慢会造成资源闲置导致浪费,推送速度过快可能会导致部分消费速度慢的消费者无法处理大量的数据而挂掉。
二、Kafka基础架构
先看一张整体图:
Producer :消息生产者,就是向 Kafka Cluster发消息的客户端。
Consumer :消息消费者,向 Kafka Cluster 取消息的客户端。
Kafka Cluster :kafka集群,暂存生产者生产的数据。
Topic:可以理解为一个队列,生产者和消费者面向的都是一个 topic。
Record: 生产者生产的消息。
再看一张详细架构图:
Consumer Group (CG):消费者组,由多个 consumer 组成。消费者组内每个消费者负责消费不同分区的数据,一个分区只能由一个组内消费者消费;消费者组之间互不影响。所有的消费者都属于某个消费者组,即消费者组是逻辑上的一个订阅者。
Broker :一台 kafka 服务器就是一个 broker。一个Kafka集群由多个 broker 组成。一个 broker可以容纳多个 topic。
Partition:为了实现扩展性,一个非常大的 topic 可以分布到多个 broker(即服务器)上,一个 topic 可以分为多个 partition,每个 partition 是一个有序的队列。
Replica:副本,为保证集群中的某个节点发生故障时,该节点上的 partition 数据不丢失,且 kafka 仍然能够继续工作,kafka 提供了副本机制,一个 topic 的每个分区都有若干个副本,一个 leader 和若干个 follower。
leader:每个分区多个副本的“主”,生产者发送数据的对象,以及消费者消费数据的对象都是 leader。
follower:每个分区多个副本中的“从”,实时从 leader 中同步数据,保持和 leader 数据的同步。leader 发生故障时,某个 follower 会成为新的follower。(这里和HDFS中的DataNode是有区别的,HDFS为实现冗余存储设置多个DataNode,这些DataNode都可以被客户端访问来获取数据,而Kafka中的follower是不会被客户端访问的,客户端取数据的时候只能去找leader)。
三、Kafka安装及入门使用
因为Kafka是基于Zookeeper的,所以在安装Kafka前请确认集群已经安装了Zookeeper。(我这里用的是三台虚拟机搭建的完全分布式集群)
下载安装包
官方下载,根据Scala的版本不同Kafka对应的也有多个版本,我这里下载的是2.11-0.11.0.0
将安装包发到集群
我用的远程连接工具是SecureCRT和SecureFx。
解压安装包
tar -zxvf kafka_2.11-0.11.0.0.tgz -C /opt/module/
修改解压后的文件名字
cd /opt/module
mv kafka_2.11-0.11.0.0/ kafka
创建data文件夹
这个文件夹主要是用来存放消息队列中的数据,以及一些元数据信息。
mkdir data
修改配置文件
cd config/
vim server.properties
主要的配置信息如下所示:
#broker 的全局唯一编号,不能重复
broker.id=102
#删除 topic 功能使能
delete.topic.enable=true
#处理网络请求的线程数量
num.network.threads=3
#用来处理磁盘 IO 的现成数量
num.io.threads=8
#发送套接字的缓冲区大小
socket.send.buffer.bytes=102400
#接收套接字的缓冲区大小
socket.receive.buffer.bytes=102400
#请求套接字的缓冲区大小
socket.request.max.bytes=104857600
#kafka 数据存放的路径
log.dirs=/opt/module/kafka/data
#topic 在当前 broker 上的分区个数
num.partitions=1
#用来恢复和清理 data 下数据的线程数量
num.recovery.threads.per.data.dir=1
#segment 文件保留的最长时间,超时将被删除
log.retention.hours=168
#配置连接 Zookeeper 集群地址
zookeeper.connect=hadoop102:2181,hadoop103:2181,hadoop104:2181
配置环境变量
sudo vim /etc/profile
##KAFKA_HOME
export KAFKA_HOME=/opt/module/kafka
export PATH=$PATH:$KAFKA_HOME/bin
刷新一下
source /etc/profile
分发安装包(记得修改不同机器上的brokerId)
xsync kafka/
启动集群(关于集群启动脚本请看这个)
启动zookeeper
zk start
启动kafka
kafka start
使用jps命令查看是否启动成功,如果没有出错的话应该是这样
[tony@hadoop102 bin]$ jps
2722 Kafka
2404 QuorumPeerMain
2847 Jps
四、Kafka命令行的基本操作
查看当前服务器中的所有 topic
[tony@hadoop102 kafka]$ bin/kafka-topics.sh --list --zookeeper hadoop102:2181
创建 topic
[tony@hadoop102 kafka]$ bin/kafka-topics.sh --zookeeper hadoop102:2181 --create --replication-factor 3 --partitions 1 -topic first
选项说明:
--topic 定义 topic 名
--replication-factor 定义副本数
--partitions 定义分区数
删除 topic
[tony@hadoop102 kafka]$ bin/kafka-topics.sh --zookeeper hadoop102:2181 --delete --topic first
需要 server.properties 中设置 delete.topic.enable=true 否则只是标记删除。
发送消息(如果想要看到当前消息需要先启动消费者)
[tony@hadoop102 kafka]$ bin/kafka-console-producer.sh --brokerlist hadoop102:9092 --topic first
> hello world
> hello kafka
消费消息
注:这里要先说明一下消费者的offset,offset相当是记录某个消费者在某个分区中最后的消费位置,下次消费时会从offset开始读取消息
[tony@hadoop102 kafka]$ bin/kafka-console-consumer.sh \ --zookeeper hadoop102:2181 --topic first
上述方式是将消费者的offset数据存入zookeeper,不过kafka0.9版本以后会出异常,会建议你存到kafka集群,所以使用下面的命令:
[tony@hadoop102 kafka]$ bin/kafka-console-consumer.sh \ --bootstrap-server hadoop102:9092 --topic first
[tony@hadoop102 kafka]$ bin/kafka-console-consumer.sh \ --bootstrap-server hadoop102:9092 --from-beginning --topic
first --from-beginning:会把主题中以往所有的数据都读取出来。(指的是offset之后的数据,不然只会读出消费者启动后最新到达的数据)
查看某个 Topic 的详情
[tony@hadoop102 kafka]$ bin/kafka-topics.sh --zookeeper hadoop102:2181 --describe --topic first
修改分区数
[tony@hadoop102 kafka]$ bin/kafka-topics.sh --zookeeper hadoop102:2181 --describe --topic first
至此结束了对Kafka基础的讲解。