说了这么就的Kafka理论知识,我们也需要实际操作一波了
使用Kafka肯定离不开使用Zookeeper的,这里我们介绍一下在3台机器上部署Zookeeper的过程(但我就只在我是在我本机上演示的,就只能展示单机版的了)
首先下载Zookeeper的压缩包,然后解压并到Zookeeper目录下
tar -xzvf zookeeper-3.4.6.tar.gz -C /home/test/app
cd ~/app
cd zookeeper-3.4.6
mkdir data log
cd conf
然后将里面的zoo_sample.cfg复制一份为zoo.cfg,并修改zoo.cfg中的配置参数
tickTime=2000
dataDir=/home/test/app/zookeeper-3.4.6/data
dataLogDir=/home/test/app/zookeeper-3.4.6/log
clientPort=2181
上面是在单机情况下要配置的参数,如果你是集群部署的话还需要添加下面的配置
#这里的hadoop000,hadoop001和hadoop002是3台机器的hostname
server.0=hadoop000:2888:3888
server.1=hadoop001:2888:3888
server.2=hadoop002:2888:3888
...
以及在dataDir所指定的目录里面创建一个myid的文件(每一台机器都要创建),然后在这个文件里面写入一个唯一的整型数字,代表id。如:你在hadoop000这台机器里面舔0,在hadoop001这台机器里面填1,以此类推。
然后,我们就可以启动Zk了,我需要到Zookeeper目录下的bin目录里面运行zkServer.sh这个命令
cd ..
bin/zkServer.sh start
bin/zkServer.sh status
这样就可以了,如果是集群部署的话,那么有一台机器在你运行了bin/zkServer.sh status命令后会显示leader,而其他的机器就是显示follower。
按照上面的做法就启动了Zk的进程了,如果不确定可以使用jps命令查看有没有QuorumPeerMain这个进程,有一般都没有问题,但主要还是使用zkServer.sh status这个命令来查看Zk的状态。
现在我们来启动Kafka了。
首先,我们先配置一下Kafka,解压Kafka的tar包,然后切换到Kafka的目录下面,创建一个logs的文件夹,然后进入到config目录里面,找到server.properties文件。
一般是集群部署的话,broker.id这个参数需要指定一个唯一的整数(每台机器都要),log.dir指定到你刚才创建的logs目录,这里将是存放你落盘的数据的,就是各个topic里面partition文件夹都存放到这里了。
然后添加参数zookpeer.connect=hadoop000:2181,hadoop001:2181,hadoop002:2181/kafka。为什么后面需要指定一个/kafka呢?是因为这个参数是指定了Kafka要将其元数据存放的地方,如果没有加/kafka的话,将直接存放在Zk里面文件系统的根目录下,这样Zk里面的文件体系就会很混乱了。Kafka的默认端口号是9092,如果你要修改的话也需要在这里指定。如果不需要的话就可以不添加了。
最后,我们启动Kafka进程。切换到bin目录下:
#后面要跟你的配置文件
bin/kafka-sever-start.sh config/server.properties
好了,Kafka今晨就启动了,这个时候我们另开一个页面运行jps命令就能查看一下Kafka的进程了。
我们需要先创建一个topic,使用命令:
#这里我们还是需要指定副本因子和分区数,以及zookeeper的路径
bin/kafka-topics.sh \
--create \
--zookeeper hadoop000:2181,hadoop001:2181,hadoop002:2181/kafka
--replication-factor 1
--parltitions 1
--topic test
我们来使用bin目录下
kafka-console-producer.sh这个命令来模拟一个有控制台充当生产者的场景。
bin/kafka-console-producer.sh \
--broker-list hadoop000:9092,hadoop001:9092,hadoop002:9092
--topic
输入完命令以后,我们就能在控制台上输入东西了
然后我们再起一个消费者来看看效果
bin/kafka-console-consumer.sh \
--zookeeper hadoop000:2181,hadoop001:2181,hadoop002:2181/kafka \
--topic test \
--from-beginning
注意到了吗,生产者是要指定broker的,而消费者则是指定zookeeper的元数据存放目录地址的。
最后我们来看下对topic的操作命令
#这个是列出所有topics来
bin/kafka-topics.sh --list --zookeeper hadoop000:2181,hadoop001:2181,hadoop002:2181/kafka
#这个是看指定topic的情况
bin/kafka-topics.sh --describe --zookeeper hadoop000:2181,hadoop001:2181,hadoop002:2181/kafka --topic test
#这个是删除指定topic
bin/kafka-topics.sh --delete --zookeeper hadoop000:2181,hadoop001:2181,hadoop002:2181/kafka --topic test
#修改指定topic
bin/kafka-topics.sh --alter --zookeeper hadoop000:2181,hadoop001:2181,hadoop002:2181/kafka --replication-factor 3 --partitions 1 --topic test
Note:如果没有在server.properties里面修改参数delete-topic-enable为true的话,删除某个topic时,系统只是为这个topic标记为删除而不是真的删除的,如果删除不了的话,可以自己手动到Kafka/logs目录下面把分区删除以及到Zk里面把元数据删除。
当要展示指定topic的时候,系统话按这样的格式展示的:
Topic:test PartitionCount:3 ReplicationFactor:3 Configs:
Topic: test Partition: 0 Leader(读写): brokerid 3 Replicas: 3,1,2 Isr: 3,1,2
Topic: test Partition: 1 Leader: 1 Replicas: 1,2,3 Isr: 1,2,3
Topic: test Partition: 2 Leader: 2 Replicas: 2,3,1 Isr: 2,3,1
这里分别展示了topic的名称,partition数量,副本因子数量,已经这些partition中在哪个机器上是原体,哪些机器是副本的。其中上面的Leader和Replicas以及Isr后面是显示broker.id,说明哪个机器是主要的,读取和写入都在这个机器上执行,其他的机器上的副本都是从这台机器上cp过去的,然后如果这个Leader机器挂掉以后,哪个机器顶上。