前情提要

首先搭建Zookeeper是在Linux上进行搭建的,并且我这里介绍的是基于我之前搭建好了的Hadoop集群,继续搭建的Zookeeper集群。也就是说您需要有Hadoop集群的基础才能和我的对应。

也不过多赘述关于IP,JDK等的基础环境问题了。

我的hadoop集群:

1号服务器 2号服务器 3号服务器
name hadoop103 hadoop103 hadoop103
IP 192.168.64.103 192.168.64.104 192.168.64.105
HDFS NameNode、DataNode DataNode SecondaryNameNode、DataNode
YARN NodeManager ResourceManager、NodeManager NodeManager

如果您和我不一样,您大概要知道,我的hadoop103对应的是您的哪个节点…

下载Zookeeper

需要安装什么版本的Zookeeper?

版本描述

根据官网描述,我们下载版本越新越好。

您已经有了hadoop的下载基础了,在Ubuntu里直接下载或是你主机浏览器中下载好再传到虚拟机你应该都了解了,不过多赘述。

官网地址https://zookeeper.apache.org/

地址页面

可以自己选择对应版本下载,我下载的是3.7.1版本(我访问网站时的最新稳当版本),下载地址(可直达):https://archive.apache.org/dist/zookeeper/zookeeper-3.7.1/

如图:

下载界面

点击 apache-zookeeper-3.7.1-bin.tar.gz 。点击即可下载。

下载完成后,移动到/usr/local目录下,过程于hadoop压缩包移动类似。

Zookeeper安装

这里只在hadoop103搭建就好了,zookeeper安装包可以用集群分发脚本发到两台从机上。

安装前准备

  1. JDK(估计你安装好了,如果没有安装好,请参看:搭建Hadoop环境

  2. 下载Zookeeper安装包,弄到/usr/local目录下

  3. 解压安装包

    • 如果是 .tar.gz 后缀,则输入命令:

      1
      tar -zxf apache-zookeeper-3.7.1-bin.tar.gz -C /usr/local/
    • 如果是 .tar 后缀,则输入命令:

      1
      tar -xf apache-zookeeper-3.7.1-bin.tar -C /usr/local/
  4. 修改安装包名称

    1
    mv apache-zookeeper-3.7.1-bin zookeeper
  5. 配置zookeeper家目录

    这不需要,我只是为了方便:

    1
    vim ~/.bashrc

    输入 i 进入编辑模式,在上面添加:

    1
    export ZOOKEEPER_HOME=/usr/local/zookeeper

    刷新资源:

    1
    source ~/.bashrc

    这样之后就可以cd $ZOOKEEPER_HOME就跳转到/usr/local/zookeeper。不用担心长,输入$ZOOK直接按Tab键就能补全,这个是Linux的代码补全,只要没有重复的配置,你输入$Z都能按Tab补全了。

    并且以后如果zookeeper目录位置改变了,只需要改变环境变量文件中的这一处,不用到处改变。

准备工作完成的效果:

完成的效果

配置修改

  1. $ZOOKEEPER_HOME/conf目录下的zoo_sample.cfg修改为zoo.cfg

    1
    mv $ZOOKEEPER_HOME/conf/zoo_sample.cfg  $ZOOKEEPER_HOME/conf/zoo.cfg
  2. 打开zoo.cfg并求改dataDir的路径:

    1
    vim $ZOOKEEPER_HOME/conf/zoo.cfg # 打开

    按 i 编辑,修改如下内容:

    将原本的dataDir=/tmp/zookeeper,修改为:dataDir=/usr/local/zookeeper/zkData

    其他zoo.cfg的配置参数如果后续也没有提到,您有需要请自行配置。

  3. 创建zkData目录

    1
    mkdir $ZOOKEEPER_HOME/zkData

到这里其实就配置好了单机了。

操作Zookeeper

这里也算是在做测试:

如果你在zookeeper根目录下,就可以不输入$ZOOKEEPER_HOME

  1. 启动Zookeeper

    1
    $ZOOKEEPER_HOME/bin/zkServer.sh start
  2. 查看是否启动

    1
    jps

    查看是否启动

  3. 查看状态

    1
    $ZOOKEEPER_HOME/bin/zkServer.sh status

    查看状态

  4. 启动客户端

    1
    $ZOOKEEPER_HOME/bin/zkCli.sh
  5. 退出客户端

    1
    quit
  6. 停止(关闭)Zookeeper

    1
    $ZOOKEEPER_HOME/bin/zkServer.sh stop 

集群安装

集群规划

三个节点:

hadoop103、hadoop104、hadoop105

这里不区分主机和从机,也不特别区分分工。

配置服务器编号

还是在hadoop103上操作:

$ZOOKEEPER_HOME/zkData目录下创建一个myid文件(注意,源码中只读取这个文件,除非你去改源码,否则只能是这个文件名)

1
touch $ZOOKEEPER_HOME/zkData/myid

编辑文件:

1
vim $ZOOKEEPER_HOME/zkData/myid

写入一个数字就行了,故名思义,myid就是说我这个节点的编号,未来方便记,我这个hadoop103,就写的3;后面hadoop104的这里写4;hadoop105的这里写5。等脚本分发过去之后再改。

配置zoo.cfg文件

打开文件:

1
vim $ZOOKEEPER_HOME/conf/zoo.cfg

新增配置(在文件最下面):

1
2
3
4
####################### cluster ########################## 
server.3=hadoop103:2888:3888
server.4=hadoop104:2888:3888
server.5=hadoop105:2888:3888

解释一下:

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

3.5.0以上的zookeeper提供了一个内嵌的Jetty容器来运行 AdminServer,默认占用的是 8080端口,AdminServer 主要是来查看 Zookeeper 的一些状态,如果机器上有其他程序(比如:Tomcat)占用了 8080 端口,会出现冲突,所以我添加你配置项:

1
2
# admin port
admin.serverPort=8081

把端口改到了8081。

分发zookeeper

如果您还没有编写集群分发脚本,请参看:集群分发脚本

1
xsync $ZOOKEEPER_HOME

然后分别去修改hadoop104和hadoop105的myid文件,和上面的修改方式一样,不赘述了。

值得一提的是,集群分发脚本是同步,如果未来zoo.cfg改变了,可不能再分发 $ZOOKEEPER_HOME了,应该单独分发zoo.cfg否则又得重新配置myid文件(因为分发之后myid的内容同步了)。

如果这一步报错,提到了:Permission denied那就是权限不够,不能在hadoop104和hadoop105上的/usr/local目录下创建文件夹zookeeper。解决办法:先在两台服务器上创建好zookeeper文件夹,并修改拥有者。

注意,前面配置Zookeeper的家目录了的,注意后面两台也要配置。这里不建议xsync ~/.bashrc因为hadoop103上可能有些Hadoop103特有的配置。所以就另外两台单独加上配置就好了。安装前准备的第5点。

操作Zookeeper集群

也算是检查后集群搭建是否成功。

分别启动zookeeper和查看状态

这里暂时没法一台控制三台一起启动,所以进入每台服务器都要执行一下这个命令:

1
$ZOOKEEPER_HOME/bin/zkServer.sh start

三台都启动了之后再分别查看状态:

1
$ZOOKEEPER_HOME/bin/zkServer.sh status

状态

可以看到hadoop104的Mode是leader,其他两个(hadoop103和hadoop105)是follower。这种就是对的,即一leader多follower。

如果启动过程报错了,请参看:搭建Zookeeper集群常见问题

Zookeeper 集群启停脚本

上面启动zookeeper服务,很麻烦,还要专门到几个服务器来启动。下面编写zookeeper集群启停脚本,和Hadoop的类似:

1
vim zk

其实直接vim,如果没有的文件会自动创建。

编写内容:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
#!/bin/bash

case $1 in
"start"){
for i in hadoop103 hadoop104 hadoop105
do
echo ---------- zookeeper $i 启动 ------------
ssh $i "$ZOOKEEPER_HOME/bin/zkServer.sh start"
done
};;
"stop"){
for i in hadoop103 hadoop104 hadoop105
do
echo ---------- zookeeper $i 停止 ------------
ssh $i "$ZOOKEEPER_HOME/bin/zkServer.sh stop"
done
};;
"status"){
for i in hadoop103 hadoop104 hadoop105
do
echo ---------- zookeeper $i 状态 ------------
ssh $i "$ZOOKEEPER_HOME/bin/zkServer.sh status"
done
};;
esac

增加脚本执行权限:

1
chmod +x zk

使用:

  1. 启动集群:

    1
    zk start
  2. 查看集群状态:

    1
    zk status
  3. 关闭集群:

    1
    zk stop