zookeeper分布式协调工具

一、分布式协调技术概述:

概述:在介绍ZooKeeper之前先介绍一种技术——分布式协调技术。那么什么是分布式协调技术?那么我来告诉大家,其实分布式协调技术主要用来解决分布式环境当中多个进程之间的同步控制,让他们有序的去访问某种临界资源;

图中有三台机器,每台机器各跑一个应用程序。然后将这三台机器通过网络将其连接起来,构成一个系统来为用户提供服务,对用户来说这个系统的架构是非透明的,他感觉不到我这个系统是一个什么样的架构。那么我们就可以把这种系统称作一个分布式系统。

  那我们接下来再分析一下,在这个分布式系统中如何对进程进行调度,我假设在第一台机器上挂载了一个资源,然后这三个物理分布的进程都要竞争这个资源,但我们又不希望他们同时进行访问,这时候我们就需要一个协调器,来让他们有序的来访问这个资源;

 

zookeeper分布式协调工具

 

二、zookeeper概述:

概述:ZooKeeper 是一个分布式的,开放源码的分布式应用程序协调服务,是 Google 的 Chubby 一个开源的实现。它提供了简单原始的功能,分布式应用可以基于它实现更高级的服务,比如分布式同步,配置管理,集群管理,命名管理,队列管理。它被设计为易于编程,使用文件系统目录树作为数据模型。我们设计 ZooKeeper 的目的是为了减轻分布式应用程序所承担的协调任务 ZooKeeper 是集群的管理者,监视着集群中各节点的状态,根据节点提交的反馈进行下 一步合理的操作。最终,将简单易用的接口和功能稳定,性能高效的系统提供给用户;

三、zookeeper提供的功能:
1.文件系统

每个子目录项如 NameService 都被称作为znode,和文件系统一样,我们能够*的增加、删除znode,在一个znode下增加、删除子znode,有四种类型的znode: 
PERSISTENT-持久化目录节点 :客户端与zookeeper断开连接后,该节点依旧存在;
PERSISTENT_SEQUENTIAL-持久化顺序编号目录节点 :客户端与zookeeper断开连接后,该节点依旧存在,只是Zookeeper给该节点名称进行顺序编号 ;
EPHEMERAL-临时目录节点 :客户端与zookeeper断开连接后,该节点被删除 ;
EPHEMERAL_SEQUENTIAL-临时顺序编号目录节点 :客户端与zookeeper断开连接后,该节点被删除,只是Zookeeper给该节点名称进行顺序编号;


2.通知机制:客户端注册监听它关心的目录节点,当目录节点发生变化(数据改变、被删除、子目录节点增加删除)时,zookeeper会通知客户端;

 

四、zookeeper工作角色:

角色:

 

zookeeper分布式协调工具

工作流程:

 

zookeeper分布式协调工具

选举机制:

zookeeper分布式协调工具

zookeeper分布式协调工具

 

五、ZooKeeper搭建Hadoop的HA集群:

HA--High Available高可用概述:在Hadoop 2.0之前,在HDFS 集群中NameNode 存在单点故障 (SPOF:A Single Point of Failure)。 对于只有一个 NameNode 的集群,如果 NameNode 机器出现故障(比如宕机或是软件、硬件升级),那么整个集群将无法使用;

实现原理:HDFS 的 HA 功能通过配置 Active/Standby 两个 NameNodes 实现在集群中对 NameNode 的 热备来解决上述问题。如果出现故障,如机器崩溃或机器需要升级维护,这时可通过此种方式将 NameNode 很快的切换到另外一台机器;

  在一个典型的 HDFS(HA) 集群中,使用两台单独的机器配置为 NameNodes 。在任何时间点, 确保 NameNodes 中只有一个处于 Active 状态,其他的处在 Standby 状态。其中 ActiveNameNode 负责集群中的所有客户端操作,StandbyNameNode 仅仅充当备机,保证一 旦 ActiveNameNode 出现问题能够快速切换;

zookeeper分布式协调工具

为了能够实时同步 Active 和 Standby 两个 NameNode 的元数据信息(实际上 editlog),需提 供一个共享存储系统,可以是 NFS、QJM(Quorum Journal Manager)或者 Zookeeper,Active Namenode 将数据写入共享存储系统,而 Standby 监听该系统,一旦发现有新数据写入,则 读取这些数据,并加载到自己内存中,以保证自己内存状态与 Active NameNode 保持基本一致,如此这般,在紧急情况下 standby 便可快速切为 active namenode;

zookeeper分布式协调工具

Zookeeper+Namenode

zookeeper分布式协调工具

 

Zookeeper+MapReduce(Yarn):

zookeeper分布式协调工具

zookeeper分布式协调工具

 

Zookeeper+Hadoop ha总结:

zookeeper分布式协调工具

 

六、案例:搭建hadoop2.7.6结合zookeeper-3.4.10完全分布式存储集群:

案例环境:

系统类型

IP地址

主机名

所需软件

角色

Centos 7.4 1708 64bit

192.168.100.101

master1

jdk-8u171-linux-x64.tar.gz

zookeeper-3.4.10.tar.gz

hadoop-2.7.6.tar.gz

hdfs:namenode

zookeeper:投票

 

Centos 7.4 1708 64bit

192.168.100.102

master2

jdk-8u171-linux-x64.tar.gz

zookeeper-3.4.10.tar.gz

hadoop-2.7.6.tar.gz

hdfs:namenode

zookeeper:投票

Centos 7.4 1708 64bit

192.168.100.103

slave1

jdk-8u171-linux-x64.tar.gz

zookeeper-3.4.10.tar.gz

hadoop-2.7.6.tar.gz

hdfs:datanode

zookeeper:投票

Centos 7.4 1708 64bit

192.168.100.104

slave2

jdk-8u171-linux-x64.tar.gz

zookeeper-3.4.10.tar.gz

hadoop-2.7.6.tar.gz

hdfs:datanode

zookeeper:observer

 

角色进程分布:

主机名

hdfs角色

Map-reduce(yarn)角色

Zookeeper角色

JNode角色

master1

namenode

NodeManager

QuorumPeerMain

DFSZKFailoverController

JobHistoryServer

JournalNode

master2

namnenode

NodeManager

QuorumPeerMain

DFSZKFailoverController

JobHistoryServer

JournalNode

slave1

datanode

NodeManager

ResourceManager

QuorumPeerMain

JournalNode

slave2

datanode

NodeManager

ResourceManager

QuorumPeerMain

JournalNode

 

案例步骤(保证节点间时间一致):

  • 配置所有节点间的域名解析及创建用户(所有节点配置相同,在此列举master1节点配置):
  • 配置master1节点远程管理:
  • 配置master2节点远程管理:
  • 在所有节点安装JDK环境(所有节点配置相同,在此列举master1节点配置):
  • 在master1节点安装zookeeper服务:
  • 配置master1节点的zookerper服务:
  • 在master2、slave1、slave2准备zookeeper目录并设置环境变量,同步master1的配置文件:
  • 配置所有节点的zookeeper的id号码并且设置slave2为observer:
  • 启动所有节点的zookeeper服务并查看服务角色状态:
  • 在master1节点访问zookeeper管理客户端控制台测试znode管理:

 

  • 在master1节点安装hadoop服务;
  • 配置master1节点的Hadoop服务:
  • 在master2、slave1、slave2节点准备hadoop目录,同步master1的配置:
  • 在所有节点初始化journalnade服务,自动创建目录:
  • 在master1节点格式化namenode节点:
  • 启动所有节点的对应namenode或datanode服务:

 

  • 访问web节点,查看hadoop集群状态;
  • 手动切换状态,在各个NameNode节点上启动DFSZK Failover Controller,并且强制设置master1作为active节点;
  • 测试Hadoop分布式集群数据存储:
  • 在master1节点初始化ha集群在zookeeper中的状态:
  • 在master1节点启动mapreduce-yarn进程:
  • 在master1节点启动historyserver进程:
  • 在master1节点开启集群的DFSZKFailoverController进程(按照以下方法);
  • 在slave1、slave2节点启动resourcemanager客户端任务进程,并且验证最终集群进程分布状态:
  • 配置所有节点间的域名解析及创建用户(所有节点配置相同,在此列举master1节点配置):

[[email protected] ~]# cat <<END >>/etc/hosts

192.168.100.101 master1

192.168.100.102 master2

192.168.100.103 slave1

192.168.100.104 slave2

END

[[email protected] ~]# useradd hadoop

[[email protected] ~]# echo "hadoop" |passwd --stdin hadoop

 

配置master1节点远程管理:

[[email protected] ~]# su - hadoop

上一次登录:四 5月 31 01:54:26 CST 2018pts/0 上

[[email protected] ~]$ ssh-****** -t rsa

[[email protected] ~]$ ssh-copy-id [email protected]

[[email protected] ~]$ ssh-copy-id [email protected]

[[email protected] ~]$ ssh-copy-id [email protected]

[[email protected] ~]$ ssh-copy-id [email protected]

[[email protected] ~]$ ssh [email protected] ##远程连接slave节点,进行确认key值文件,不然在启动hadoop时,会出现key的问题导致无法启动

[[email protected] ~]$ ssh [email protected]

[[email protected] ~]$ ssh [email protected]

[[email protected] ~]$ ssh [email protected]

 

  • 配置master2节点远程管理:

[[email protected] ~]# su - hadoop

上一次登录:四 5月 31 01:54:26 CST 2018pts/0 上

[[email protected] ~]$ ssh-****** -t rsa

[[email protected] ~]$ ssh-copy-id [email protected]

[[email protected] ~]$ ssh-copy-id [email protected]

[[email protected] ~]$ ssh-copy-id [email protected]

[[email protected] ~]$ ssh-copy-id [email protected]

[[email protected] ~]$ ssh [email protected] 

[[email protected] ~]$ ssh [email protected]

[[email protected] ~]$ ssh [email protected]

[[email protected] ~]$ ssh [email protected]

 

  • 在所有节点安装JDK环境(所有节点配置相同,在此列举master1节点配置):

[[email protected] ~]$ exit

[[email protected] ~]# yum -y install psmisc

[[email protected] ~]# tar zxvf jdk-8u171-linux-x64.tar.gz

[[email protected] ~]# mv /root/jdk1.8.0_171/ /usr/local/java/

[[email protected] ~]# ls /usr/local/java/

[[email protected] ~]# cat <<END >>/etc/profile

JAVA_HOME=/usr/local/java/

JRE_HOME=\$JAVA_HOME/jre

CLASS_PATH=.:\$JAVA_HOME/lib/dt.jar:\$JAVA_HOME/lib/tools.jar:\$JAVA_HOME/lib

PATH=\$PATH:\$JAVA_HOME/bin:\$JRE_HOME/bin

export JAVA_HOME JRE_HOME CLASS_PATH PATH

END

[[email protected] ~]# source /etc/profile

[[email protected] ~]# java -version

java version "1.8.0_171"

 

  • 在master1节点安装zookeeper服务:

[[email protected] ~]# wget http://mirror.bit.edu.cn/apache/zookeeper/zookeeper-3.4.10/zookeeper-3.4.10.tar.gz

[[email protected] ~]# tar zxvf zookeeper-3.4.10.tar.gz

[[email protected] ~]# mv zookeeper-3.4.10 /usr/local/zookeeper

[[email protected] ~]# ls /usr/local/zookeeper

bin         docs             NOTICE.txt            zookeeper-3.4.10.jar

build.xml   ivysettings.xml  README_packaging.txt  zookeeper-3.4.10.jar.asc

conf        ivy.xml          README.txt            zookeeper-3.4.10.jar.md5

contrib     lib              recipes               zookeeper-3.4.10.jar.sha1

dist-maven  LICENSE.txt      src

[[email protected] ~]# chown hadoop:hadoop /usr/local/zookeeper -R

[[email protected] master ~]# vi /etc/profile

export ZOOKEEPER_HOME=/usr/local/zookeeper

export PATH=$PATH:$ZOOKEEPER_HOME/bin

[[email protected] ~]# source /etc/profile

 

  • 配置master1节点的zookerper服务:

[[email protected] ~]# su - hadoop

[[email protected] ~]$ mkdir /usr/local/zookeeper/data     

[[email protected] ~]$ mv /usr/local/zookeeper/conf/zoo_sample.cfg /usr/local/zookeeper/conf/zoo.cfg

[[email protected] ~]$ vi /usr/local/zookeeper/conf/zoo.cfg

  12 dataDir=/usr/local/zookeeper/data

  29 server.1=master1:2888:3888

  30 server.2=master2:2888:3888

  31 server.3=slave1:2888:3888

  32 server.4=slave2:2888:3888:observer

 

注解:zoo.cfg配置文件详解

  • Server.A=B:C:D。

A是一个数字,表示这个是第几号服务器;

B是这个服务器的ip地址;

C是这个服务器与集群中的Leader服务器交换信息的端口;

D是万一集群中的Leader服务器挂了,需要一个端口来重新进行选举,选出一个新的Leader,而这个端口就是用来执行选举时服务器相互通信的端口。

集群模式下配置一个文件myid,这个文件在dataDir目录下,这个文件里面有一个数据就是A的值,Zookeeper启动时读取此文件,拿到里面的数据与zoo.cfg里面的配置信息比较从而判断到底是哪个server;

  • tickTime=2000:通信心跳数,Zookeeper服务器心跳时间,单位毫秒;
  • initLimit=10:LF初始通信时限,集群中的follower跟随者服务器与leader领导者服务器之间初始连接时能容忍的最多心跳数(tickTime的数量),用它来限定集群中的Zookeeper服务器连接到Leader的时限;
  • syncLimit=5:跟随者与领导者同步通信时限,集群中Leader与Follower之间的最大响应时间单位,假如响应超过syncLimit * tickTime,Leader认为Follwer死掉,从服务器列表中删除Follwer。
  • dataDir:数据文件目录+数据持久化路径,保存内存数据库快照信息的位置,如果没有其他说明,更新的事务日志也保存到数据库;
  • clientPort=2181:客户端连接端口;

 

[[email protected] ~]$ touch /usr/local/zookeeper/data/myid

[[email protected] ~]$ echo 1 >/usr/local/zookeeper/data/myid

 

  • 在master2、slave1、slave2准备zookeeper目录并设置环境变量,同步master1的配置文件:

[[email protected] ~]# mkdir /usr/local/zookeeper

[[email protected] ~]# chown hadoop:hadoop /usr/local/zookeeper

[[email protected] ~]# vi /etc/profile

export ZOOKEEPER_HOME=/usr/local/zookeeper

export PATH=$PATH:$ZOOKEEPER_HOME/bin

[[email protected] ~]# source /etc/profile

 

[[email protected] ~]# mkdir /usr/local/zookeeper

[[email protected] ~]# chown hadoop:hadoop /usr/local/zookeeper

[[email protected] slave1 ~]# vi /etc/profile

export ZOOKEEPER_HOME=/usr/local/zookeeper

export PATH=$PATH:$ZOOKEEPER_HOME/bin

[[email protected] slave1 ~]# source /etc/profile

 

[[email protected] ~]# mkdir /usr/local/zookeeper

[[email protected] ~]# chown hadoop:hadoop /usr/local/zookeeper

[[email protected] slave2 ~]# vi /etc/profile

export ZOOKEEPER_HOME=/usr/local/zookeeper

export PATH=$PATH:$ZOOKEEPER_HOME/bin

[[email protected] slave2 ~]# source /etc/profile

 

[[email protected] ~]$ scp -r /usr/local/zookeeper/* [email protected]:/usr/local/zookeeper/

[[email protected] ~]$ scp -r /usr/local/zookeeper/* [email protected]:/usr/local/zookeeper/

[[email protected] ~]$ scp -r /usr/local/zookeeper/* [email protected]:/usr/local/zookeeper/

 

  • 配置所有节点的zookeeper的id号码并且设置slave2为observer:

[[email protected] ~]# su - hadoop

[[email protected] ~]$ echo 2 >/usr/local/zookeeper/data/myid

 

[[email protected] ~]# su - hadoop

[[email protected] ~]$ echo 3 >/usr/local/zookeeper/data/myid

 

[[email protected] ~]# su - hadoop

[[email protected] ~]$ echo 4 >/usr/local/zookeeper/data/myid

[[email protected] ~]$ echo peerType=observer >>/usr/local/zookeeper/conf/zoo.cfg

 

  • 启动所有节点的zookeeper服务并查看服务角色状态:

zookeeper分布式协调工具

 

zookeeper分布式协调工具

 

 

 

 

 

 

 

 

 

 

  • 在master1节点访问zookeeper管理客户端控制台测试znode管理:

zookeeper分布式协调工具

查看帮助:

zookeeper分布式协调工具

查看根目录节点:

zookeeper分布式协调工具

创建节点:

zookeeper分布式协调工具

 

 

 

创建临时节点:

zookeeper分布式协调工具

 

重新进入控制台后,发现临时节点消失:

zookeeper分布式协调工具

 

创建带有序号的节点:

zookeeper分布式协调工具

修改节点的值:

zookeeper分布式协调工具

zookeeper分布式协调工具

zookeeper分布式协调工具

zookeeper分布式协调工具

zookeeper分布式协调工具

 

 

 

 

监控节点的变化:

zookeeper分布式协调工具

在slave1节点登录,更改节点的值:

zookeeper分布式协调工具

zookeeper分布式协调工具

在master1节点验证监控情况:

zookeeper分布式协调工具

删除单个节点与递归删除整个节点目录:

zookeeper分布式协调工具

查看节点状态:

zookeeper分布式协调工具

zookeeper分布式协调工具

  • 在master1节点安装hadoop服务;

[[email protected] ~]$ exit

[[email protected] ~]# tar zxvf hadoop-2.7.6.tar.gz

[[email protected] ~]# mv /root/hadoop-2.7.6/ /usr/local/hadoop/

[[email protected] ~]# ls /usr/local/hadoop/

bin  etc  include  lib  libexec  LICENSE.txt  NOTICE.txt  README.txt  sbin  share

[[email protected] ~]# cat <<END >>/etc/profile

export HADOOP_HOME=/usr/local/hadoop/

export PATH=\$PATH:\$HADOOP_HOME/bin

END

[[email protected] ~]# source /etc/profile

[[email protected] ~]# echo "export JAVA_HOME=/usr/local/java/" >>/usr/local/hadoop/etc/hadoop/hadoop-env.sh

##设置HDFS存储加载jdk的环境变量

[[email protected] ~]# echo "export JAVA_HOME=/usr/local/java/" >>/usr/local/hadoop/etc/hadoop/yarn-env.sh

##设置mapreduceV2版本--YARN加载jdk的环境变量

[[email protected] ~]# mkdir /usr/local/hadoop/name/ ##存放namenode中元数据的位置

[[email protected] ~]# mkdir /usr/local/hadoop/data/ ##存放datanode中的数据目录

[[email protected] ~]# mkdir /usr/local/hadoop/tmp/ ##存放用户临时文件

[[email protected] ~]# mkdir /usr/local/hadoop/var/ ##存放服务动态变化文件

[[email protected] ~]# chown hadoop /usr/local/hadoop/ -R

 

  • 配置master1节点的Hadoop服务:

[[email protected] ~]# su - hadoop

[[email protected] ~]$ vi /usr/local/hadoop/etc/hadoop/core-site.xml

<configuration>

<!-- 指定运行hadoop后生成临时文件存放位置 -->

<property>

        <name>hadoop.tmp.dir</name>

        <value>/usr/local/hadoop/tmp</value>

   </property>

<!-- 指定默认hadoop集群名称 -->

<property>

   <name>fs.defaultFS</name>

   <value>hdfs://mycluster</value>

</property>

<!-- 指定ZKFC故障自动切换转移,2181是zookeeper的端口 -->

<property>

     <name>ha.zookeeper.quorum</name>

     <value>master1:2181,master2:2181,slave1:2181,slave2:2181</value>

</property>

</configuration>

 

[[email protected] ~]$ vi /usr/local/hadoop/etc/hadoop/hdfs-site.xml

<configuration>

<!-- 指定name元数据存储位置 -->

<property>

   <name>dfs.name.dir</name>

   <value>/usr/local/hadoop/name</value>

</property>

<!-- 指定data数据存放位置 -->

<property>

   <name>dfs.data.dir</name>

   <value>/usr/local/hadoop/data</value>

</property>

<!-- 指定hdfs文件副本数量 -->

<property>

   <name>dfs.replication</name>

   <value>2</value>

</property>

<!-- 开启hdfsweb界面 -->

<property>

      <name>dfs.webhdfs.enabled</name>

      <value>true</value>

</property>

<!-- 完全分布式集群名称 -->

<property>

  <name>dfs.nameservices</name>

  <value>mycluster</value>

</property>

<!-- 集群中NameNode节点都有哪些 -->

<property>

   <name>dfs.ha.namenodes.mycluster</name>

   <value>nn1,nn2</value>

</property>

<!-- nn1的RPC通信地址 -->

<property>

   <name>dfs.namenode.rpc-address.mycluster.nn1</name>

   <value>master1:8020</value>

</property>

<!-- nn2的RPC通信地址 -->

<property>

   <name>dfs.namenode.rpc-address.mycluster.nn2</name>

   <value>master2:8020</value>

</property>

<!-- nn1的http通信地址 -->

<property>

   <name>dfs.namenode.http-address.mycluster.nn1</name>

   <value>master1:50070</value>

</property>

<!-- nn2的http通信地址 -->

<property>

    <name>dfs.namenode.http-address.mycluster.nn2</name>

    <value>master2:50070</value>

</property>

<!-- 指定NameNode元数据在JournalNode上的存放位置 -->

<property>

    <name>dfs.namenode.shared.edits.dir</name>

    <value>qjournal://master1:8485;master2:8485;slave1:8485;slave2:8485/mycluster</value>

</property>

<!-- 配置隔离机制,即同一时刻只能有一台服务器对外响应 -->

<property>

    <name>dfs.ha.fencing.methods</name>

    <value>sshfence</value>

</property>

<!-- 使用隔离机制时需要ssh无秘钥登录-->

<property>

    <name>dfs.ha.fencing.ssh.private-key-files</name>

    <value>/home/hadoop/.ssh/id_rsa</value>

</property>

<!-- 声明journalnode服务器存储目录-->

<property>

   <name>dfs.journalnode.edits.dir</name>

   <value>/usr/local/hadoop/data/ha/jn</value>

</property>

<!-- 关闭权限检查-->

<property>

   <name>dfs.permissions.enable</name>

   <value>false</value>

</property>

<!-- 访问代理类:client,mycluster,active配置失败自动切换实现方式-->

<property>

   <name>dfs.client.failover.proxy.provider.mycluster</name>

<value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value>

</property>

<!-- 配置自动故障转移-->

<property>

   <name>dfs.ha.automatic-failover.enabled</name>

   <value>true</value>

</property>

</configuration>

 

[[email protected] ~]$ mv /usr/local/hadoop/etc/hadoop/mapred-site.xml.template /usr/local/hadoop/etc/hadoop/mapred-site.xml

[[email protected] ~]$ vi /usr/local/hadoop/etc/hadoop/mapred-site.xml

<configuration>

<!-- 指定mapreduce生成文件的目录 -->

<property>

      <name>mapred.local.dir</name>

       <value>/usr/local/hadoop/var</value>

</property>

<!-- 指定mapreduce的v2版本yarn -->

<property>

      <name>mapreduce.framework.name</name>

       <value>yarn</value>

</property>

<!-- 指定mr历史服务器主机,端口 -->

  <property>

    <name>mapreduce.jobhistory.address</name>

    <value>master1:10020</value>

  </property>

<!-- 指定mr历史服务器WebUI主机、端口 -->

  <property>

    <name>mapreduce.jobhistory.webapp.address</name>

    <value>master1:19888</value>

  </property>

<!-- 历史服务器的WEB UI上最多显示20000个历史的作业记录信息 -->

  <property>

    <name>mapreduce.jobhistory.joblist.cache.size</name>

    <value>20000</value>

  </property>

</configuration>

 

[[email protected] ~]$ vi /usr/local/hadoop/etc/hadoop/yarn-site.xml

<configuration>

 <property>

        <name>yarn.nodemanager.aux-services</name>

        <value>mapreduce_shuffle</value>

    </property>

    <!--启用resourcemanager ha-->

    <property>

        <name>yarn.resourcemanager.ha.enabled</name>

        <value>true</value>

    </property>

    <!--声明两台resourcemanager的地址-->

    <property>

        <name>yarn.resourcemanager.cluster-id</name>

        <value>rmCluster</value>

    </property>

    <property>

        <name>yarn.resourcemanager.ha.rm-ids</name>

        <value>rm1,rm2</value>

    </property>

    <property>

        <name>yarn.resourcemanager.hostname.rm1</name>

        <value>slave1</value>

    </property>

    <property>

        <name>yarn.resourcemanager.hostname.rm2</name>

        <value>slave2</value>

    </property>

    <!--指定zookeeper集群的地址-->

    <property>

        <name>yarn.resourcemanager.zk-address</name>

        <value>master1:2181,master2:2181,slave1:2181,slave2:2181</value>

    </property>

    <!--启用自动恢复-->

    <property>

        <name>yarn.resourcemanager.recovery.enabled</name>

        <value>true</value>

    </property>

    <!--指定resourcemanager的状态信息存储在zookeeper集群-->

    <property>

        <name>yarn.resourcemanager.store.class</name>

<value>org.apache.hadoop.yarn.server.resourcemanager.recovery.ZKRMStateStore</value>

    </property>

</configuration>

 

[[email protected] ~]$ cat <<END >/usr/local/hadoop/etc/hadoop/slaves

master1

master2

slave1

slave2

END

 

  • 在master2、slave1、slave2节点准备hadoop目录,同步master1的配置:

[[email protected] ~]$ exit

[[email protected] ~]# mkdir /usr/local/hadoop

[[email protected] ~]# chown hadoop:hadoop /usr/local/hadoop

[[email protected] ~]# cat <<END >>/etc/profile

export HADOOP_HOME=/usr/local/hadoop/

export PATH=\$PATH:\$HADOOP_HOME/bin

END

[[email protected] ~]# source /etc/profile

 

[[email protected] ~]$ exit

[[email protected] ~]# mkdir /usr/local/hadoop

[[email protected] ~]# chown hadoop:hadoop /usr/local/hadoop

[[email protected] ~]# cat <<END >>/etc/profile

export HADOOP_HOME=/usr/local/hadoop/

export PATH=\$PATH:\$HADOOP_HOME/bin

END

[[email protected] ~]# source /etc/profile

 

[[email protected] ~]$ exit

[[email protected] ~]# mkdir /usr/local/hadoop

[[email protected]~]# chown hadoop:hadoop /usr/local/hadoop

[[email protected] ~]# cat <<END >>/etc/profile

export HADOOP_HOME=/usr/local/hadoop/

export PATH=\$PATH:\$HADOOP_HOME/bin

END

[[email protected] ~]# source /etc/profile

 

[[email protected] ~]$ scp -r /usr/local/hadoop/* [email protected]:/usr/local/hadoop/

[[email protected] ~]$ scp -r /usr/local/hadoop/* [email protected]:/usr/local/hadoop/

[[email protected] ~]$ scp -r /usr/local/hadoop/* [email protected]:/usr/local/hadoop/

 

  • 在所有节点初始化journalnode服务,自动创建目录:

 

zookeeper分布式协调工具

 

 

 

 

 

 

  • 在master1节点格式化namenode节点:

zookeeper分布式协调工具

 

 

启动所有节点的对应namenode或datanode服务:

 

zookeeper分布式协调工具

 

zookeeper分布式协调工具

zookeeper分布式协调工具

 

 

 

 

 

 

 

  • 访问web节点,查看hadoop集群状态;
  •  

zookeeper分布式协调工具

zookeeper分布式协调工具

zookeeper分布式协调工具

 

  • 手动切换状态,在各个NameNode节点上启动DFSZK Failover Controller,并且强制设置master1作为active节点

[[email protected] ~]$ /usr/local/hadoop/sbin/hadoop-daemon.sh start zkfc

starting zkfc, logging to /usr/local/hadoop/logs/hadoop-hadoop-zkfc-master1.out

 

[[email protected] ~]$ /usr/local/hadoop/sbin/hadoop-daemon.sh start zkfc

starting zkfc, logging to /usr/local/hadoop/logs/hadoop-hadoop-zkfc-master2.out

 

zookeeper分布式协调工具

zookeeper分布式协调工具

zookeeper分布式协调工具

测试Hadoop分布式集群数据存储:

zookeeper分布式协调工具

 

在master1节点初始化ha集群在zookeeper中的状态:

 

zookeeper分布式协调工具

 

 

 

 

 

  • 在master1节点启动mapreduce-yarn进程:
  •  

zookeeper分布式协调工具

 

 

 

 

在master1节点启动historyserver进程:

 

zookeeper分布式协调工具

 

 

 

  • 在master1节点开启集群的DFSZKFailoverController进程(按照以下方法);
  •  

zookeeper分布式协调工具

 

 

 

zookeeper分布式协调工具

zookeeper分布式协调工具

zookeeper分布式协调工具

 

 

  • 在slave1、slave2节点启动resourcemanager客户端任务进程,并且验证最终集群进程分布状态:
  •  

zookeeper分布式协调工具

zookeeper分布式协调工具

zookeeper分布式协调工具

 

 

 

 

集群Namenode节点高可用测试:

 

zookeeper分布式协调工具

 

 

 

 

 

集群resourceManager节点高可用测试:

 

zookeeper分布式协调工具