目录

 

简述

zookeeper安装

zookeeper启动原理


hadoop HA参照:

简述

zookeeper是Google的Chubby一个开源的实现。它是一个针对大型分布式系统的可靠协调系统,提供的功能包括:配置维护、名字服务、分布式同步、组服务等。ZooKeeper的目标就是封装好复杂易出错的关键服务,将简单易用的接口和性能高效、功能稳定的系统提供给用户。

zookeeper重在协调,是分布式服务的一个基础;要构建hadoop离线分析,首先要安装zookeeper。

zookeeper安装

安装包:zookeeper-3.4.11.tar.gz        
 选择版本:zookeeper--release 3.4.11,修复了53个问题,支持Java9,2017-11月9日发布
 1)zookeeper安装包放到:/usr/software/zookeeper-3.4.11.tar.gz目录下,解压:        
 tar -zxvf zookeeper-3.4.11.tar.gz        
 cd zookeeper-3.4.11/conf        
 拷贝 cp zoo_sample.cfg 改名成 zoo.cfg        
 cp -r zoo_sample.cfg zoo.cfg        
 2)创建data目录:the directory where the snapshot is stored。快照存储地点。        
 mkdir /usr/software/zookeeper-3.4.11/data        
 创建log路径:mkdir /usr/software/zookeeper-3.4.11/logs        
 3)修改zoo.cfg文件:vim zoo.cfg        
 tickTime=2000        
 initLimit=10        
 ZooKeeper集群模式下包含多个zk进程,其中一个进程为leader,余下的进程为follower。
 当follower最初与leader建立连接时,它们之间会传输相当多的数据,尤其是follower的数据落后leader很多。        
 initLimit配置follower与leader之间建立连接后进行同步的最长时间。        
 syncLimit=5   #配置follower和leader之间发送消息,请求和应答的最大时间长度。        
 dataDir=/usr/software/zookeeper-3.4.11/data        
 dataLogDir=/usr/software/zookeeper-3.4.11/logs        
 clientPort=2181        
 #server.id=host:port1:port2        
 server.1=hadoop01:2888:3888   #其中id为一个数字,表示zk进程的id,这个id也是dataDir目录下myid文件的内容。        
 server.2=hadoop02:2888:3888   #host是该zk进程所在的IP地址,        
 server.3=hadoop03:2888:3888   #port1表示follower和leader交换消息所使用的端口,
 server.4=hadoop04:2888:3888   #port2表示选举leader所使用的端口。        
 server.5=hadoop05:2888:3888        
 4)在data目录下创建myid文件并添加内容为1        
 cd /usr/software/zookeeper-3.4.11/data        
 echo 1 > myid        
 根据以上步骤在hadoop02~hadoop05节点安装好zookeeper        
 注:hadoop02节点上的myid内容为2,hadoop03节点上的myid内容为3。        
 echo 2 > myid        
 5)启动zookeeper集群        
 /usr/software/zookeeper-3.4.11/bin/./zkServer.sh start        
 /usr/software/zookeeper-3.4.11/bin/./zkServer.sh stop        
 /usr/software/zookeeper-3.4.11/bin/./zkServer.sh restart        
 /usr/software/zookeeper-3.4.11/bin/./zkServer.sh status


启动之后查看

hadoop01

ZooKeeper版本和hadoop对应关系 zookeeper与hadoop的关系_配置文件

hadoop02

ZooKeeper版本和hadoop对应关系 zookeeper与hadoop的关系_zookeeper_02

hadoop03

ZooKeeper版本和hadoop对应关系 zookeeper与hadoop的关系_运维_03

hadoop04

ZooKeeper版本和hadoop对应关系 zookeeper与hadoop的关系_zookeeper_04

hadoop05

ZooKeeper版本和hadoop对应关系 zookeeper与hadoop的关系_zookeeper_05

6)设置开机自启            
第一种方法:直接修改/etc/rc.local文件            
在/etc/rc.local文件中需要输入两行,其中export JAVA_HOME=/usr/java/jdk1.8.0_112是必须要有的,            
否则开机启动不成功,大家根据自己JDK安装的位置自行更改。另一行/usr/software/zookeeper-3.4.11/bin/zkServer.sh start
则是我们zookeeper的启动命令。配置好之后,重启虚拟机,会发现已经可以开机自启了。
第二种方法:把zookeeper做成服务            
1、进入到/etc/init.d目录下,新建一个zookeeper脚本            
touch zookeeper            
2、添加执行权限:chmod +x zookeeper            
3、使用命令vim zookeeper进行编辑            
在脚本中输入如下内容,其中同上面注意事项一样要添加export JAVA_HOME=//usr/java/jdk1.8.0_112这一行,否则无法正常启动。            

#!/bin/bash            
 #chkconfig:2345 20 90            
 #description:zookeeper            
 #processname:zookeeper            
 export JAVA_HOME=//usr/java/jdk1.8.0_112            
 case $1 in            
         start) su root /usr/local/zookeeper-3.4.5/bin/zkServer.sh start;;            
         stop) su root /usr/local/zookeeper-3.4.5/bin/zkServer.sh stop;;            
         status) su root /usr/local/zookeeper-3.4.5/bin/zkServer.sh status;;            
         restart) su /usr/local/zookeeper-3.4.5/bin/zkServer.sh restart;;            
         *) echo "require start|stop|status|restart" ;;            
 esac

        
4、使用service zookeeper start/stop命令来尝试启动关闭zookeeper,使用service zookeeper status查看zookeeper状态。
5、添加到开机自启            
chkconfig --add zookeeper            
zookeeper       0:关闭    1:关闭    2:启用    3:启用    4:启用    5:启用    6:关闭            
chkconfig --list        查看所有服务    
本次实验采取第一种方法
如果zookeeper,服务器重启需要按照一定次序重启,否则容易出现连接不上错误·

zookeeper启动原理

ZooKeeper版本和hadoop对应关系 zookeeper与hadoop的关系_zookeeper_06

QuorumPeerMain是zookeeper集群的启动入口类,是用来加载配置启动QuorumPeer线程的。
QuorumPeer,谷歌翻译quorum是法定人数,定额的意思,peer是对等的意思,那么QuorumPeer中quorum代表的意思就是每个zookeeper集群启动的时候集群中zookeeper服务数量就已经确定了,zookeeper是基于paxos算法实现的,那是一个唯一的分布式集群一致性算法,在zookeeper中将这一算法演绎为集群分布式协调可持续服务。在每个zookeeper的配置文件中配置集群中的所有机器配置中每个server.X记录代表集群中的一个服务,QuorumPeerConfig会构建一个QuorumServer对象,其中的server.X中的X代表zookpeer的sid,每个zookeeper都会编辑自己的sid在dataDir目下的myid文件中,sid标记每个服务,在快速选举中起作用。所以对这个进程不应该陌生,如果你要关闭,就直接zkServer.sh stop 就可以了。

ZooKeeper版本和hadoop对应关系 zookeeper与hadoop的关系_zookeeper_07

1.通过zkServer.sh启动zookeeper时,正常指定的QuorumPeerMain作为启动主类。
2.QuorumPeerMain执行main方法,里面主要逻辑是执行initializeAndRun方法。
 public static void main(String[] args) {

QuorumPeerMain main = new QuorumPeerMain();
         try {
             main.initializeAndRun(args);
         ....
     }


3.initializeAndRun方法
(1)通过QuorumPeerConfig.parse方法,解析配置文件
(2)通过DatadirCleanupManager.start方法,启动清除调度任务
(3)runFromConfig或ZooKeeperServerMain.main来启动zookkeeper

protected void initializeAndRun(String[] args)
         throws ConfigException, IOException, AdminServerException
     {
         QuorumPeerConfig config = new QuorumPeerConfig();
         if (args.length == 1) {//如果指定的配置文件
             config.parse(args[0]);//解析配置文件
         }
         // Start and schedule the the purge task
         //启动安排清除任务
         DatadirCleanupManager purgeMgr = new DatadirCleanupManager(config
                 .getDataDir(), config.getDataLogDir(), config
                 .getSnapRetainCount(), config.getPurgeInterval());
         purgeMgr.start();
         if (args.length == 1 && config.isDistributed()) {
             runFromConfig(config);//启动zookeepeer集群
         } else {
             LOG.warn("Either no config or no quorum defined in config, running "
                     + " in standalone mode");
             // there is only server in the quorum -- run as standalone
             ZooKeeperServerMain.main(args);
         }
     }