最近想学一下大数据,这年头,不会大数据,都不敢说自己是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
2export 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
5dataDir=/root/zkdata (要创建文件夹)
dataLogDir=/root/zklogdata (要创建文件夹)
server.1=shizhan1:2888:3888 (主机名, 心跳端口、数据端口)
server.2=shizhan2:2888:3888
server.3=shizhan3:2888:3888
5 然后创建上面说的那俩文件夹,1
2mkdir /root/zkdata
mkdir /root/zklogdata
注意,这里三台机子都要创建。
6 将配好的zookeeper拷到另外两台机子上1
2scp -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
2cd /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里有quorumpeermain1
2
3
4Starting 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地址之间的映射关系就可以了。
注意:只有在建立了映射关系之后,才可以将在同一个网段下的机器利用主机名进行文件传递。问题解决!