本文安装配置环境为多个ubuntu20.04 集群,安装包皆来自apache官网,分别为kafka2.4.1 + zookeeper3.6.3 + jdk1.8,在文章末尾附上自用的zookeeper、kafka群起脚本
注: 本文不包含jdk安装,详情见我的上一篇jdk1.8+hadoop3.2+scala2.12+spark3.1.2配置记录
Zookeeper3.6.3安装配置(已完成解压,目录为/home/hadoop/Zookeeper)
复制配置文件并重命名
cp ~/Zookeeper/conf/zoo_sample.cfg ~/Zookeeper/conf/zoo.cfg
新建Data文件夹,存放运行数据
mkdir ~/Zookeeper/zkData
修改配置文件内容
# The number of milliseconds of each tick
tickTime=2000
# The number of ticks that the initial
# synchronization phase can take
initLimit=10
# The number of ticks that can pass between
# sending a request and getting an acknowledgement
syncLimit=5
# the directory where the snapshot is stored.
# do not use /tmp for storage, /tmp here is just
# example sakes.
dataDir=/home/hadoop/Zookeeper/zkData
# the port at which the clients will connect
clientPort=2181
#######################cluster##########################
server.1=hadoop101:2888:3888
server.2=hadoop102:2888:3888
server.3=hadoop103:2888:3888
server.4=hadoop104:2888:3888
# server.A=B:C:D。
# A,文件myid里面的数据就是A的值,位于zkData根目录;
# B,当前服务器地址;
# C,集群中Follower与Leader交换信息的端口;
# D,执行选举时服务器相互通信的端口。
运行:
/home/hadoop/Zookeeper/bin/zkServer.sh start
不同服务器中应修改对应的myid内容,文件路径为Zookeeper/zkData/myid
将该文件中的数值改成对应服务器序号即可,如我的hadoop101中保持1,hadoop102修改成2,以此类推。
注: 也可参考jdk1.8+hadoop3.2+scala2.12+spark3.1.2配置记录中将bin文件夹注入到.bashrc中作为环境变量使用
Kafka2.4.1安装配置(已完成解压,目录为/home/hadoop/Kafka)
修改Kafka/config/server.properties文件
############################# Server Basics #############################
# broker的全局唯一编号,不能重复
broker.id=1
# 删除topic功能使用
delete.topic.enable=true
############################# Socket Server Settings #############################
# 处理网络请求的线程数量
num.network.threads=3
# 用来处理磁盘IO的线程数量
num.io.threads=8
# 发送套接字的缓冲区大小
socket.send.buffer.bytes=102400
# 接收套接字的缓冲区大小
socket.receive.buffer.bytes=102400
# 请求套接字的缓冲区大小
socket.request.max.bytes=104857600
############################# Log Basics #############################
# kafka运行日志存放的路径
log.dirs=/home/hadoop/Kafka/logs
# topic在当前broker上的分区个数
num.partitions=1
# 用来恢复和清理data目录中数据的线程数量
num.recovery.threads.per.data.dir=1
############################# Internal Topic Settings #############################
offsets.topic.replication.factor=1
transaction.state.log.replication.factor=1
transaction.state.log.min.isr=1
############################# Log Flush Policy #############################
# NULL
############################# Log Retention Policy #############################
# 日志segment文件保留的最长时间,超时将被删除
log.retention.hours=168
# 日志段文件的最大大小,超过将新建日志段。
log.segment.bytes=1073741824
# 日志段删除的时间间隔
log.retention.check.interval.ms=300000
############################# Zookeeper #############################
# 配置连接Zookeeper集群地址
zookeeper.connect=hadoop101:2181,hadoop102:2181,hadoop103:2181,hadoop104:2181/kafka
# 连接到ZooKeeper的超时时间(毫秒)
zookeeper.connection.timeout.ms=18000
############################# Group Coordinator Settings #############################
group.initial.rebalance.delay.ms=0
注: 在每个服务器中该文件中的broker.id值应不同
修改kafka中的zookeeper配置,文件路径:Kafka/config/zookeeper.properties,修改其中dataDir为响应路径即可,其他属性按需修改
dataDir=/home/hadoop/Zookeeper
运行:
/home/hadoop/Kafka/bin/kafka-server-start.sh -daemon /home/hadoop/Kafka/config/server.properties
当然在安装过程中也遇到不少问题,一下列出代表性问题,并给出解决方案:
1、使用群启脚本启动kafka时日志报错:
nohup: failed to run command 'java': No such file or directory
解决方案
修改Kafka/bin/kafka-run-class.sh中内容,在该文件头部添加需要使用的JAVA_HOME绝对路径即可(网传在群起脚本中添加的source /etc/profile无果可采取这种办法):
export JAVA_HOME="/home/hadoop/JDK"
2、启动后kafka闪退,日志报错zookeeper连接2181超时
解决方案
该错误有以下几点可能:
- 防火墙策略问题
- zookeeper未安装
- zookeeper配置错误
- zookeeper没在启动Kafka之前启动
3、zookeeper本地启动无问题,但群起Zookeeper脚本会导致日志报错JAVA_HOME找不到
解决方案
和问题1一样,添加JAVA_HOME的绝对路径,文件路径为Zookeeper/bin/zkEnv.sh
JAVA_HOME="/home/hadoop/JDK"
4、群起脚本跑完后发现只有一台机器成功运行zookeeper
重点关注上文提及的唯一编号的属性值(zookeeper:myid;kafka:broker.id)是否在每台机器上作出修改,再考虑配置错误
群起脚本附录:
Zookeeper
#! /bin/bash
case $1 in
"start"){
for i in `cat /home/hadoop/Hadoop/etc/hadoop/workers`
do
echo "========== $i =========="
ssh $i "/home/hadoop/Zookeeper/bin/zkServer.sh start"
echo $?
done
};;
"stop"){
for i in `cat /home/hadoop/Hadoop/etc/hadoop/workers`
do
echo "========== $i =========="
ssh $i "/home/hadoop/Zookeeper/bin/zkServer.sh stop"
echo $?
done
};;
"status"){
for i in `cat /home/hadoop/Hadoop/etc/hadoop/workers`
do
echo "========== $i =========="
ssh $i "/home/hadoop/Zookeeper/bin/zkServer.sh status"
echo $?
done
};;
esac
Kafka
#! /bin/bash
case $1 in
"start"){
for i in `cat /home/hadoop/Hadoop/etc/hadoop/workers`
do
echo "========== $i =========="
ssh $i "/home/hadoop/Kafka/bin/kafka-server-start.sh -daemon /home/hadoop/Kafka/config/server.properties"
echo $?
done
};;
"stop"){
for i in `cat /home/hadoop/Hadoop/etc/hadoop/workers`
do
echo "========== $i =========="
ssh $i "/home/hadoop/Kafka/bin/kafka-server-stop.sh"
echo $?
done
};;
esac