kafka与zookeeper安装(疯狂踩坑)

zookeeper3.5.8安装

1.集群规划

在 hadoop102、 hadoop103 和 hadoop104 三个节点上部署 Zookeeper。

2.解压安装

1.解压 Zookeeper 安装包到/opt/module/目录下

[mhr@hadoop102 software]$ tar -zxvf zookeeper-3.5.8.tar.gz -C /opt/module/

2.拷贝配置好的 zookeeper 到其他机器上

[mhr@hadoop102 module]$ xsync zookeeper-3.5.8

3.配置服务器编号

1.在/opt/module/zookeeper-3.5.8/这个目录下创建 zkData

[mhr@hadoop102 zookeeper-3.5.8]$ mkdir -p zkData

2.在/opt/module/zookeeper-3.5.8/zkData 目录下创建一个 myid 的文件

[mhr@hadoop102 zkData]$ touch myid

添加 myid 文件,注意一定要在 linux 里面创建,在 notepad++里面很可能乱码

3.编辑 myid 文件

[mhr@hadoop102 zkData]$ vi myid

在文件中添加与 server 对应的编号:

2

4.拷贝配置好的zookeeper配置文件到其他机器上

[mhr@hadoop102 zkData]$ xsync myid

hadoop103和hadoop104做相对应的操作改变文件中编号为3和4
xsync 是一个群发脚本,需要预先对三台机器配置ssh免密登录

1.在/home/mhr 目录下创建 bin 目录,并在 bin 目录下 xsync 创建文件,文件内容如下:

[mhr@hadoop102 ~]$ mkdir bin
[mhr@hadoop102 ~]$ cd bin/
[mhr@hadoop102 bin]$ touch xsync
[mhr@hadoop102 bin]$ vi xsync
#!/bin/bash
#1 获取输入参数个数,如果没有参数,直接退出
pcount=$#
if((pcount==0)); then
echo no args;
exit;
fi
#2 获取文件名称
p1=$1
fname=`basename $p1`
echo fname=$fname
#3 获取上级目录到绝对路径
pdir=`cd -P $(dirname $p1); pwd`
echo pdir=$pdir
#4 获取当前用户名称
user=`whoami`
#5 循环
for((host=103; host<105; host++)); do
echo ------------------- hadoop$host --------------
rsync -rvl $pdir/$fname $user@hadoop$host:$pdir
done

2.修改脚本 xsync 具有执行权限

[mhr@hadoop102 bin]$ sudo chmod 777 xsync

3.调用脚本形式: xsync 文件名称

[mhr@hadoop102 bin]$ xsync /home/mhr/bin

4.配置 zoo.cfg 文件

1.重命名/opt/module/zookeeper-3.5.8/conf 这个目录下的 zoo_sample.cfg 为 zoo.cfg

[mhr@hadoop102 conf]$ mv zoo_sample.cfg zoo.cfg

2.打开 zoo.cfg 文件

[mhr@hadoop102 conf]$ vim zoo.cfg

修改数据存储路径配置

dataDir=/opt/module/zookeeper-3.5.8/zkData

增加如下配置

#######################cluster##########################
server.2=hadoop102:2888:3888
server.3=hadoop103:2888:3888
server.4=hadoop104:2888:3888

3.配置参数解读

server.A=B:C:D。
A 是一个数字,表示这个是第几号服务器;
集群模式下配置一个文件 myid, 这个文件在 dataDir 目录下,这个文件里面有一个数据
就是 A 的值, Zookeeper 启动时读取此文件,拿到里面的数据与 zoo.cfg 里面的配置信息比
较从而判断到底是哪个 server。
B 是这个服务器的地址;
C 是这个服务器 Follower 与集群中的 Leader 服务器交换信息的端口;
D 是万一集群中的 Leader 服务器挂了,需要一个端口来重新进行选举,选出一个新的
Leader,而这个端口就是用来执行选举时服务器相互通信的端口。

4.拷贝配置好的 zookeeper 到其他机器上

[mhr@hadoop102 conf]$ xsync zoo_cfg

5.集群操作

1.分别启动 Zookeeper

[mhr@hadoop102 zookeeper-3.6.2]$ bin/zkServer.sh start
[mhr@hadoop103 zookeeper-3.6.2]$ bin/zkServer.sh start
[mhr@hadoop104 zookeeper-3.6.2]$ bin/zkServer.sh start

2.查看状态

[mhr@hadoop102 zookeeper-3.6.2]# bin/zkServer.sh status
ZooKeeper JMX enabled by default
Using config: /opt/module/zookeeper-3.6.2/bin/../conf/zoo.cfg
Client port found: 2181. Client address: localhost. Client SSL: false.
Mode: follower

[mhr@hadoop103 zookeeper-3.6.2]# bin/zkServer.sh status
ZooKeeper JMX enabled by default
Using config: /opt/module/zookeeper-3.6.2/bin/../conf/zoo.cfg
Client port found: 2181. Client address: localhost. Client SSL: false.
Mode: leader

[mhr@hadoop104 zookeeper-3.6.2]# bin/zkServer.sh status
ZooKeeper JMX enabled by default
Using config: /opt/module/zookeeper-3.6.2/bin/../conf/zoo.cfg
Client port found: 2181. Client address: localhost. Client SSL: false.
Mode: follower

3.群起脚本

#!/bin/bash

case $1 in
 "start")
	for i in hadoop102 hadoop103 hadoop104
	do
	echo "========== $i =========="
	ssh $i '/opt/module/zookeeper-3.6.2/bin/zkServer.sh start'
	done
;;
"stop")
	for i in hadoop102 hadoop103 hadoop104
	do
	echo "========== $i =========="
	ssh $i '/opt/module/zookeeper-3.6.2/bin/zkServer.sh stop'
	done
;;
*)
	echo '输入参数应为start或stop'
;;
esac

kafka 2.13-2.7.0安装

1.安装部署

1.集群规划

hadoop102hadoop103hadoop104
zkzkzk
kafkakafkakafka

2.jar 包下载

http://kafka.apache.org/downloads.html

2.集群部署

1) 解压安装包

[mhr@hadoop102 software]$ tar -zxvf kafka_2.11-0.11.0.0.tgz -C /opt/module/

2) 修改解压后的文件名称

[mhr@hadoop102 module]$ mv kafka_2.11-0.11.0.0/ kafka

3)在/opt/module/kafka 目录下创建 logs 文件夹

[mhr@hadoop102 kafka]$ mkdir logs

4) 修改配置文件

[mhr@hadoop102 kafka]$ cd config/
[mhr@hadoop102 config]$ vi server.properties

输入以下内容:

#broker 的全局唯一编号,不能重复
broker.id=0
#删除 topic 功能使能,在1.0.0版本后已经默认为true了
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/logs
#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

5)配置环境变量

[mhr@hadoop102 module]$ sudo vi /etc/profile
#KAFKA_HOME
export KAFKA_HOME=/opt/module/kafka
export PATH=$PATH:$KAFKA_HOME/bin
[mhr@hadoop102 module]$ source /etc/profile

6)分发安装包

[mhr@hadoop102 module]$ xsync kafka/

注意:分发之后记得配置其他机器的环境变量

7)分别在 hadoop103 和 hadoop104 上修改配置文件/opt/module/kafka/config/server.properties中的 broker.id=1、 broker.id=2

注: broker.id 不得重复

8) 启动集群

依次在 hadoop102、 hadoop103、 hadoop104 节点上启动 kafka

[mhr@hadoop102 kafka]$ bin/kafka-server-start.sh -daemon config/server.properties
[mhr@hadoop103 kafka]$ bin/kafka-server-start.sh -daemon config/server.properties
[mhr@hadoop104 kafka]$ bin/kafka-server-start.sh -daemon config/server.properties

9)关闭集群

[mhr@hadoop102 kafka]$ bin/kafka-server-stop.sh stop
[mhr@hadoop103 kafka]$ bin/kafka-server-stop.sh stop
[mhr@hadoop104 kafka]$ bin/kafka-server-stop.sh stop

10) kafka 群起脚本

#!/bin/bash

case $1 in
"start")
	for i in hadoop102 hadoop103 hadoop104
	do
		echo "========== $i =========="
		ssh $i 'source /etc/profile;/opt/module/kafka/bin/kafka-server-start.sh -daemon /opt/module/kafka/config/server.properties'
	done
;;
"stop")
	for i in hadoop102 hadoop103 hadoop104
	do
		echo "========== $i =========="
		ssh $i 'source /etc/profile;/opt/module/kafka/bin/kafka-server-stop.sh /opt/module/kafka/config/server.properties'
	done
;;
esac

11)kafka关闭脚本

#!/bin/bash
PIDS=$(jps -lm | grep -i 'kafka.Kafka' | awk '{print $1}')

if [ -z "$PIDS" ]; then
  echo "No kafka server to stop"
  exit 1
else
  kill -9 $PIDS
fi

坑来了

1.zookeeper启动报错

Zookeeper JAVA_HOME is not set and java could not be found in PATH

解决
进入Zookeeperbin目录下,修改zkEnv.sh文件
添加 JAVA_HOME

if [ "x${ZOO_LOG4J_PROP}" = "x" ]
then
    ZOO_LOG4J_PROP="INFO,CONSOLE"
fi

JAVA_HOME="/opt/module/jdk1.8.0_11"

if [[ -n "$JAVA_HOME" ]] && [[ -x "$JAVA_HOME/bin/java" ]];  then
    JAVA="$JAVA_HOME/bin/java"
elif type -p java; then
    JAVA=java
else
    echo "Error: JAVA_HOME is not set and java could not be found in PATH." 1>&2
    exit 1
fi

2.kafka启动后秒退

查看日志后报错信息如下

[2021-02-14 18:20:21,516] INFO Registered kafka:type=kafka.Log4jController MBean (kafka.utils.Log4jControllerRegistration$)
[2021-02-14 18:20:21,741] ERROR Exiting Kafka due to fatal exception (kafka.Kafka$)
java.lang.VerifyError: Uninitialized object exists on backward branch 50
Exception Details:
  Location:
    scala/util/matching/Regex.unapplySeq(Ljava/lang/CharSequence;)Lscala/Option; @97: goto
  Reason:
    Error exists in the bytecode
  Bytecode:
    0000000: 2ab6 004b 2bb6 004f 4d2a 2cb6 0053 9900
    0000010: 6abb 0055 59b2 005a 572c b600 5e3e bb00
    0000020: 6059 b700 643a 0419 041d b900 6a02 0003
    0000030: 3605 1505 1da2 002f 2c15 0504 60b6 006e
    0000040: 3a08 1908 013a 083a 0719 0701 3a07 3a06
    0000050: 1904 1906 b600 7257 013a 0615 0504 6036
    0000060: 05a7 ffd1 1904 b900 7601 00c0 0078 013a
    0000070: 0401 3a06 b700 7bb0 b200 80b0          
  Stackmap Table:
    full_frame(@50,{Object[#2],Object[#140],Object[#57],Integer,Object[#96],Integer},{Uninitialized[#17],Uninitialized[#17]})
    full_frame(@100,{Object[#2],Object[#140],Object[#57],Integer,Object[#96],Integer},{Uninitialized[#17],Uninitialized[#17]})
    chop_frame(@120,3)

	at scala.collection.StringOps$.r$extension(StringOps.scala:843)
	at kafka.cluster.EndPoint$.<clinit>(EndPoint.scala:29)
	at kafka.server.Defaults$.<clinit>(KafkaConfig.scala:79)
	at kafka.server.KafkaConfig$.<clinit>(KafkaConfig.scala:994)
	at kafka.metrics.KafkaMetricsConfig.<init>(KafkaMetricsConfig.scala:33)
	at kafka.metrics.KafkaMetricsReporter$.startReporters(KafkaMetricsReporter.scala:62)
	at kafka.server.KafkaServerStartable$.fromProps(KafkaServerStartable.scala:33)
	at kafka.Kafka$.main(Kafka.scala:68)
	at kafka.Kafka.main(Kafka.scala)

解决方法:这种情况其实挺常见的,主要就是jdk的版本兼容,我的jdk是1.8.0_11将jdk升级为1.8.0_281。

3.kafka单台机器启动没问题,一旦使用群起脚本就不报错也没有反应

最后在kafkaServer.out日志中发现bash: jps: command not found
解决
首先确定已经配置了 jdk/bin 的环境变量

可以在启动的命令前增加 source /etc/profile,jps命令即可生效

4.kafka官方的stop脚本不能关闭进程

No kafka server to stop

解决
那么我们自己来写一个脚本,其实也就是使用jps找到kafka的进程号,然后直接kill -9

#!/bin/bash
PIDS=$(jps -lm | grep -i 'kafka.Kafka' | awk '{print $1}')

if [ -z "$PIDS" ]; then
  echo "No kafka server to stop"
  exit 1
else
  kill -9 $PIDS
fi
  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值