环境:kafka_2.10-0.10.2.1.tgz,Hadoop-2.7.3集群,zookeeper-3.4.10
安装kafka之前,需要先安装zookeeper集群。可以参考zookeeper安装
说明一下:2.10是scala是版本,0.10.2.1才是kafka的版本。
1.解压到指定目录
tar -zxvf kafka_2.10-0.10.2.1.tgz -C /usr/local
2. 配置kakfa
涉及到的配置文件为${KAFA_HOME}/config/server.properties必须要配置的是这三个参数:broker.id、log.dirs、zookeeper.connect。broker.id表示当前broker的id,要求是唯一的非负数。log.dirs表示kafka日志的存放目录。zookeeper.connect表示连接的zookeeper的地址。
broker.id=0
log.dirs=/usr/local/kafka_2.10-0.10.2.1/kafka_logs
zookeeper.connect=Desktop:2181,Server1:2181,Server2:2181,Server2:2181
注意:需要先创建/usr/local/kafka_2.10-0.10.2.1/kafka_logs目录。我这里的Desktop是Master节点。Server是Slave
3.复制到其他节点
zhang@Desktop:/usr/local$ scp -r kafka_2.10-0.10.2.1/ zhang@Server1:/usr/local
zhang@Desktop:/usr/local$ scp -r kafka_2.10-0.10.2.1/ zhang@Server2:/usr/local
zhang@Desktop:/usr/local$ scp -r kafka_2.10-0.10.2.1/ zhang@Server3:/usr/local
在Server1机器上将server.properties配置文件的broker.id值改为1。
在Server2机器上将server.properties配置文件的broker.id值改为2。
在Server3机器上将server.properties配置文件的broker.id值改为3。
4.添加环境变量
在Desktop(也就是Master),Server1,Server2,Server3的/etc/profile文件中添加如下内容:
export KAFKA_HOME=/usr/local/kafka_2.10-0.10.2.1
export PATH=${KAFKA_HOME}/bin:$PATH
每个主机执行完了别忘了执行:source /etc/profile
5.启动验证
在Desktop(也就是Master),Server1(Slave1),Server2,Server3上分别执行kafka启动命令:
zhang@Desktop:~$ cd ${KAFKA_HOME}
zhang@Desktop:/usr/local/kafka_2.10-0.10.2.1$ kafka-server-start.sh -daemon ./config/server.properties
这里的xcall.sh是我自己的一个脚本。相当于在每台节点上执行同一个命令。
如果每个节点都成功启动了Kafka这个进程,说明搭建成功。如果发现某台机器上没有kafka这个进程,可以将kafka的启动命令去掉参数-daemon(加上的话表示后台启动),这样可以直接在屏幕上看到错误信息。
如果kafka进程无法关闭的话,可以使用:kill 12308关闭。
6.测试用例
测试用例采用发布-订阅模式(也就是主题模式)
(1)创建一个主题
创建一个有3个分区,一个副本的主题test主题。随便在集群中的哪个节点创建都可以。
kafka-topics.sh --zookeeper Desktop:2181,Server1:2181,Server2:2181,Server3:2181 --create --topic test --replication-factor 1 --partitions 3
(2)创建一个生产者
在Master创建一个生产者
kafka-console-producer.sh --broker-list Desktop:9092,Server1:9092,Server2:9092,Server3:9092 --topic test
(3)在Slave节点上创建消费者
我在每个Slave节点上都创建了一个消费者。在每个Slave节点执行命令:
kafka-console-consumer.sh --zookeeper Desktop:2181,Server1:2181,Server2:2181,Server3:2181 --topic test --from-beginning
(4)发布消息
然后在生产者(Master)终端发消息。
可以看到,在每个消息者终端都接收到了一样的消息。
Slave1:
Slave2:
Slave3:
常见问题解决:
1.Kafka启动后自动关闭。
查看安装目录下的logs目录中的日志。其中kafkaServer.out中有报错:
[2018-06-05 21:13:40,831] INFO shutting down (kafka.server.KafkaServer)
[2018-06-05 21:13:40,835] INFO EventThread shut down for session: 0x0 (org.apache.zookeeper.ClientCnxn)
[2018-06-05 21:13:40,839] INFO shut down completed (kafka.server.KafkaServer)
[2018-06-05 21:13:40,840] FATAL Fatal error during KafkaServerStartable startup. Prepare to shutdown (kafka.server.KafkaServerStartable)
org.I0Itec.zkclient.exception.ZkTimeoutException: Unable to connect to zookeeper server 'Desktop:2181,Server1:2181,Server2:2181,Server3:2181' with timeout of 6000 ms
at org.I0Itec.zkclient.ZkClient.connect(ZkClient.java:1233)
at org.I0Itec.zkclient.ZkClient.<init>(ZkClient.java:157)
at org.I0Itec.zkclient.ZkClient.<init>(ZkClient.java:131)
at kafka.utils.ZkUtils$.createZkClientAndConnection(ZkUtils.scala:106)
at kafka.utils.ZkUtils$.apply(ZkUtils.scala:88)
at kafka.server.KafkaServer.initZk(KafkaServer.scala:326)
at kafka.server.KafkaServer.startup(KafkaServer.scala:187)
at kafka.server.KafkaServerStartable.startup(KafkaServerStartable.scala:39)
at kafka.Kafka$.main(Kafka.scala:67)
at kafka.Kafka.main(Kafka.scala)
[2018-06-05 21:13:40,842] INFO shutting down (kafka.server.KafkaServer)
看信息,是因为配置文件中配置了zookeeper.connection。但是zkServer并没有启动。解决方法是先启动配置文件中的所有zkServer,再启动kafka。