安装zookeeper时候,可以查看进程启动,但是状态显示报错 Error contacting service. It is probably not running

最近想学一下大数据,这年头,不会大数据,都不敢说自己是21世纪新青年。

大数据有很多要学的框架,比如hadoop spark storm zookeeper等等,今天拿zookeeper入个门,安装过程中遇到点坑,分享一下。

Zookeeper是一个分布式协调服务;就是为用户的分布式应用程序提供协调服务
A、zookeeper是为别的分布式程序服务的
B、Zookeeper本身就是一个分布式程序(只要有半数以上节点存活,zk就能正常服务)
C、Zookeeper所提供的服务涵盖:主从协调服务器节点动态上下线、统一配置管理、分布式共享锁、统一名称服务……
D、虽然说可以提供各种服务,但是zookeeper在底层其实只提供了两个功能:
—管理(存储,读取)用户程序提交的数据
—并为用户程序提供数据节点监听服务;

1 部署
用的是三台虚拟机,centOS 7
jdk 8
zookeeper3.4.5
三台机器网络己配好,host配置如下

1
2
3
4
5
6
7
[root@shizhan1 conf]# cat /etc/hosts
127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4
::1 localhost localhost.localdomain localhost6 localhost6.localdomain6
127.0.0.1 shizhan1
192.168.33.3 shizhan1
192.168.33.4 shizhan2
192.168.33.5 shizhan3

2 安装
https://pan.baidu.com/s/1O-E6pq3zbzoqRvxHoj66eQ 放我网盘了,zookeeper3.4.5

下载到shizhan1(第一台机子)中,我放在了/root/work/
解压:
tar -zxvf zookeeper-3.4.5.tar.gz
重命名:
mv zookeeper-3.4.5 zookeeper(重命名文件夹zookeeper-3.4.5为zookeeper,太长 写起来好麻烦)

3 环境变量:
vi /etc/profile
添加内容:

1
2
export ZOOKEEPER_HOME=/root/work/zookeeper
export PATH=$PATH:$ZOOKEEPER_HOME/bin

source 一下,也就是把你写的环境变量激活一下
source /etc/profile

注意,这里三台机子都要改环境变量哟,第二部安装可以只在一个机子上装好,然后拷到其他机子上去,但是环境变量三个都要改。

4 配置文件
cd zookeeper/conf进入conf目录
cp zoo_sample.cfg zoo.cfg 把例子copy一个出来,命名为zoo.cfg,我们要改的就是这个。
vi zoo.cfg
添加内容:

1
2
3
4
5
dataDir=/root/zkdata (要创建文件夹)
dataLogDir=/root/zklogdata (要创建文件夹)
server.1=shizhan1:2888:3888 (主机名, 心跳端口、数据端口)
server.2=shizhan2:2888:3888
server.3=shizhan3:2888:3888

5 然后创建上面说的那俩文件夹,

1
2
mkdir /root/zkdata
mkdir /root/zklogdata

注意,这里三台机子都要创建。
6 将配好的zookeeper拷到另外两台机子上

1
2
scp -r /root/work/zookeeper hadoop@slave2:/home/hadoop/
scp -r /root/work/zookeeper hadoop@slave3:/home/hadoop/

7 在/root/zkdata/中创建myid文件,注意每台机子都要创建,但是值不一样,在步骤4中,如第一台,server.1=shizhan1:2888:3888,shizhan1是主机名,前面的serverl.1中的1,就是shizhan1这台机子上myid文件的值。以这台机子为例,其他两台的值分别为2 和 3。

1
2
cd /root/zkdata/
echo 1 > myid

8 启动服务

1
2
3
4
[root@shizhan1 bin]# zkServer.sh start
JMX enabled by default
Using config: /root/work/zookeeper/bin/../conf/zoo.cfg
Starting zookeeper ... STARTED

9 查看服务

1
2
3
4
[root@shizhan2 conf]# zkServer.sh status
JMX enabled by default
Using config: /root/work/zookeeper/bin/../conf/zoo.cfg
Mode: follower

只有出现上面类似内容才是成功了。

排坑–
今天启动后,发现jps里有quorumpeermain

1
2
3
4
Starting zookeeper ... already running as process 1398.
[root@shizhan2 ~]# jps
1398 QuorumPeerMain
1559 Jps

但是状态显示报错:Error contacting service. It is probably not running

1)在网上查阅资料一共有几种解决方法:
打开zkServer.sh 找到status)

STAT=echo stat | nc localhost $(grep clientPort "$ZOOCFG" | sed -e 's/.*=//') 2> /dev/null| grep Mode
在nc与localhost之间加上 -q 1 (是数字1而不是字母l)
如果已存在则去掉
注:因为我用的zookeeper是3.4.5版本,所以在我的zkServer.sh脚本文件里根本没有这一行,所以没有生效

2)调用sh zkServer.sh status 遇到这个问题。百度,google了后发现有人是修改sh脚本里的一个nc的参数来解决,可在3.4.5的sh文件里并没有找到nc的调用。配置文档里指定的log目录没有创建导致出错,手动增加目录后重启,问题解决。
注:我想不是日志的问题所以这个方法根本就没有试

3)创建数据目录,也就是在你zoo.cfg配置文件里dataDir指定的那个目录下创建myid文件,并且指定id,改id为你zoo.cfg文件中server.1=shizhan1:2888:3888中的 1.只要在myid头部写入1即可.

4)因为防火墙没有关闭。关闭防火墙:

1
2
3
4
5
6
7
8
9
10
#查看防火墙状态

service iptables status

#关闭防火墙
service iptables stop
#查看防火墙开机启动状态
chkconfig iptables --list
#关闭防火墙开机启动
chkconfig iptables off

注意:我的确在开始时候没有关闭防火墙,但是当我关闭防火墙之后也没有解决问题。

如果是centOS 7,

1
2
[root@shizhan2 conf]# systemctl stop firewalld.service
[root@shizhan2 conf]# systemctl disable firewalld.service

我就是关防火墙的时候,用了iptables 那个命令,提示中显示如下,我就大概一看,以为是说防火墙没开,其实人家早就换新命令啦。

1
2
3
[root@shizhan1 work]# service iptables stop
Redirecting to /bin/systemctl stop iptables.service
Failed to stop iptables.service: Unit iptables.service not loaded.

5) 没有建立主机和ip之间的映射关系。

建立主机和ip之间映射关系的命令为 vim /etc/hosts 在文件的末端加入各个主机和ip地址之间的映射关系就可以了。

注意:只有在建立了映射关系之后,才可以将在同一个网段下的机器利用主机名进行文件传递。问题解决!