Kafka的分布式安装及基本操作-刘宇
作者:刘宇
CSDN博客地址:https://blog.csdn.net/liuyu973971883
有部分资料参考,如有侵权,请联系删除。如有不正确的地方,烦请指正,谢谢。
一、Kafka的分布式安装
1、前期准备
- 三台服务器并安装好zookeeper集群
- kafka的安装包或者源码包
安装包:http://archive.apache.org/dist/kafka/1.1.1/kafka_2.11-1.1.1.tgz
源码包:http://archive.apache.org/dist/kafka/1.1.1/kafka-1.1.1-src.tgz
2、安装过程
2.1、解压安装包
tar -zxvf /software/kafka_2.11-1.1.1.tgz -C /software/
2.2、重命名
mv /software/kafka_2.11-1.1.1/ /software/kafka
2.3、添加环境变量
修改环境变量文件:vi /etc/profile
#添加如下代码
export KAFKA_HOME=/software/kafka
export PATH=$PATH:$KAFKA_HOME/bin
立即生效:source /etc/profile
2.4、修改配置文件
vi /software/kafka/config/server.properties
#当前kafka实例的id,必须为整数,一个集群中不可重复
broker.id=1
#生产到kafka中的数据存储的目录,目录需要手动创建
log.dirs=/software/kafka/data/kafka-logs
#kafka数据在zk中的存储目录
zookeeper.connect=192.168.40.101:2181,192.168.40.102:2181,192.168.40.103:2181/kafka
2.5、同步到其他服务器
scp -r kafka/ root@192.168.40.102:/software/
scp -r kafka/ root@192.168.40.103:/software/
2.6、分别修改两台服务器上的broker的id
#192.168.40.102上修改为12
broker.id=2
#192.168.40.103上修改为13
broker.id=3
2.7、创建数据目录
mkdir -p /software/kafka/data/kafka-logs
2.8、启动Kafka
分别启动三台服务器上的Kafka
cd /software/kafka/bin
./kafka-server-start.sh -daemon ../config/server.properties
启动成功
2.9、检查集群是否启动成功
登录zookeeper
cd /software/zookeeper-3.4.14/bin
./zkCli.sh
ls /kafka/brokers/ids
出现三个节点则表示三台kafka搭建成功
二、Kafka在zookeeper中的目录说明
/kafka
/cluster
/id {"version":"1","id":"Pks8sWZUT6GBJHqyVGQ5OA"}#代表的是一个kafka集群包含集群的版本,和集群的id
/controller {"version":1,"brokerid":1,"timestamp":"1564976668049"}#controller是kafka中非常重要的一个角色,意为控制器,控制partition的leader选举,topic的crud操作。brokerid意为由 其id对应的broker承担controller的角色。
/controller_epoch#代表的是controller的纪元,换句话说是代表controller的更迭,每当controller 的brokerid更换一次,controller_epoch就+1.
/brokers
/ids [1, 2, 3]#存放当前kafka的broker实例列表
/topics [hadoop, __consumer_offsets]#当前kafka中的topic列表
/seqid#系统的序列id
/consumers#老版本用于存储kafka消费者的信息,主要保存对应的offset,新版本中基本不用,此时用 户的消费信息,保存在一个系统的topic中:__consumer_offsets
/config#存放配置信息
三、Kafka的基本操作
topic是kafka非常重要的核心概念,是用来存储各种类型的数据的,所以最基本的就需要学会如何在kafka中创建、修改、删除的topic,以及如何向topic生产消费数据。
1、创建topic
- topic:指定要创建的topic的名称
- zookeeper:指定kafka关联的zk地址
- partitions:指定该topic的分区个数
- replication-factor:指定副本因子
./kafka-topics.sh --create --topic hadoop --zookeeper 192.168.40.101:2181,192.168.40.102:2181,192.168.40.103:2181/kafka --partitions 3 --replication-factor 3
注
指定副本因子的时候,不能大于broker实例个数,否则报错:
zookeeper的前后变化
Kafka数据目录的变化
2、查看topic的列表
./kafka-topics.sh --list --zookeeper 192.168.40.101:2181,192.168.40.102:2181,192.168.40.103:2181/kafka
3、查看每一个topic的信息
./kafka-topics.sh --describe --topic hadoop --zookeeper 192.168.40.101:2181,192.168.40.102:2181,192.168.40.103:2181/kafka
3.1、topic信息讲解
- Partition: 当前topic对应的分区编号
- Replicas : 副本因子,当前kafka对应的partition所在的broker实例的broker.id的列表
- Leader : 该partition的所有副本中的leader领导者,处理所有kafka在该partition读写请求
- ISR : 该partition的存活的副本对应的broker实例的broker.id的列表
Topic:hadoop PartitionCount:3 ReplicationFactor:3 Configs:
Topic: hadoop Partition: 0 Leader: 3 Replicas: 3,2,1 Isr: 3,2,1
Topic: hadoop Partition: 1 Leader: 1 Replicas: 1,3,2 Isr: 1,3,2
Topic: hadoop Partition: 2 Leader: 2 Replicas: 2,1,3 Isr: 2,1,3
4、修改topic
注:partition个数,只能增加,不能减少
./kafka-topics.sh --alter --topic hadoop --partitions 4 --zookeeper 192.168.40.101:2181,192.168.40.102:2181,192.168.40.103:2181/kafka
5、删除topic
在老版本的时候,是不能直接删除掉topic,除非你配置了delete.topic.enable=true,可以直接删除掉,如果你没配置,那么就不会直接删除,会做一个标记,那么这个Topic就不能用了,而在新版本的时候,不需要设置这些参数了,直接删除掉了
./kafka-topics.sh --delete --topic hadoop --zookeeper 192.168.40.101:2181,192.168.40.102:2181,192.168.40.103:2181/kafka
6、生产和消费数据
6.1、生产数据
- topic:往指定主题发生数据
- broker-list:指定Kafka的broker列表
./kafka-console-producer.sh --topic hadoop --broker-list 192.168.40.101:9092,192.168.40.102:9092,192.168.40.103:9092
6.2、消费数据
启动消费者后发现之前的数据是获取不到的,如果想要获取消费者启动之前的数据,可以添加一个参数–from-beginning。但是如果该topic有多个分区则不能保证其消费的顺序性
./kafka-console-consumer.sh --topic hadoop --bootstrap-server 192.168.40.101:9092,192.168.40.102:9092,192.168.40.103:9092
四、 Kafka的数据消费的总结
- topic:消费的主题
- bootstrap-server:对应的zookeeper
- group:该消费者所在的分组
- offset:从该分区的什么位置开始消费
- partition:消费哪一个分区中的数据(也可不设置)
./kafka-console-consumer.sh --topic hadoop --bootstrap-server 192.168.40.101:9092,192.168.40.102:9092,192.168.40.103:9092 --group haha --offset earliest --partition 2
kafka消费者在消费数据的时候,都是分组别的。不同组的消费不受影响,相同组内的消费,需要注意,如果partition有3个,消费者有3个,那么便是每一个消费者消费其中一个partition对应的数据;如果有2个消费者,此时一个消费者消费其中一个partition数据,另一个消费者消费2个partition的数据。如果有超过3个的消费者,同一时间只能最多有3个消费者能消费得到数据。
结论:
- 在一个消费者组内消费数据,同一时间不会有两个消费者同时消费一个分区的数据
- 在两个消费者组内,同一时间可以有两个消费者同时消费一个分区的数据
在组内,kafka的topic的partition个数,代表了kafka的topic的并行度,同一时间最多可以有多个线程来消费topic的数据,所以如果要想提高kafka的topic的消费能力,应该增大partition的个数。
五、 Kafka分区中的offset
是kafka的topic中的partition中的每一条消息的标识,如何区分该条消息在kafka对应的partition的
位置,就是用该偏移量。offset的数据类型是Long,8个字节长度。offset在分区内是有序的,分区间是不一定有序。如果想要kafka中的数据全局有序,就只能让partition个数为1。