目录
一、Hadoop高可用
1、zoomkeeper集群部署
2、hdfs高可用
二、Yarn高可用
1、RM高可用部署
2、RM高可用测试
三、Hbase高可用
1、Hbase 分布式部署
2、测试
一、Hadoop高可用
为了提供快速的故障恢复,Standby NN 也需要保存集群中各个文件块的存储位置。为了实现这个,集群中所有的 Database 将配置好 Active NN 和 Standby NN 的位置,并向它们发送块文件所在的位置及心跳,如下图所示:

两个NameNode为了数据同步,会通过一组称作JournalNodes的独立进程进行相互通信。当active状态的NameNode的命名空间有任何修改时,会告知大部分的JournalNodes进程。standby状态的NameNode有能力读取JNs中的变更信息,并且一直监控edit log的变化,把变化应用于自己的命名空间。standby可以确保在集群出错时,命名空间状态已经完全同步了
1、zoomkeeper集群部署
由于一个HDFS集群由一个NameNode节点和多个DataNode节点组成,一旦NameNode节点宕机,那么HDFS将不能进行文件的上传与下载。
Hadoop依赖Zookeeper实现HDFS集群的高可用,由状态为Active的NameNode节点对外提供服务,而状态为StandBy的NameNode节点则负责数据的同步,一旦状态为Active的NameNode节点宕机,则状态为StandBy的NameNode节点将会切换为Active状态对外提供服务。
需要五台虚拟机:两个主节点做高可用server13、server15(2G内存),其余是DN(如果电脑内存不足 1.5G内存也可以)
真实主机再开启一台虚拟机server5
server13停止所有运行的节点
所有节点删除/tmp目录下的所有数据,清理hadoop 



server15安装nfs
server15添加hadoop用户,挂载nfs中server13分享的/home/hadoop目录到本地的/home/hadoop目录,然后切换到hadoop用户进行测试 
server13查看对server15免密成功
真实主机将zookeeper包发送到server11的/home/hadoop目录下
解压zookeeper安装包
切换到zookeeper目录 进入conf目录下 复制zoo_sample.cfg文件为zoo.cfg
因为是nfs文件系统所以其他节点的内容也同步修改了
在/tmp/下创建zookeeper目录 编辑zoo.cfg文件
指定数据目录为/tmp/zookeeper 指定server11在zk集群中节点编号为1 依次类推server12的编号为2 server14的编号为3
2888端口用来同步数据 3888端口用来选举leader
server11将自己的编号1输入到zookeeper/myid内
server12和14同样创建zookeeper目录并将自己的编号输入到zookeeper/myid内

server11开启zkServer 
server11查看自己的zk集群状态,显示follower
jps查看开启了QuorumPeerMain进程
QuorumPeerMain是zookeeper集群的启动类,用来加载配置启动QuorumPeer线程的。Quorum是定额的意思,Peer是对等的意思。Quorum表示zookeeper启动后,服务数量就确定了。zookeeper是基于paxos算法实现的,paxos是一个唯一的分布式集群一致性算法,在zookeeper中,被演绎为集群分布式协调可持续服务。

同样server12 14开启zkServer 并查看自己的ZK集群状态 


2、hdfs高可用
server13编辑core-site.xml文件,指定hdfs的NN为master,指定zookeeper集群主机的地址和端口 
[hadoop@server13 hadoop]$ cat core-site.xml
<configuration>
<!-- 指定 hdfs 的 namenode 为 masters (名称可自定义)-->
<property>
<name>fs.defaultFS</name>
<value>hdfs://masters</value>
</property>
<!-- 指定 zookeeper 集群主机地址 -->
<property>
<name>ha.zookeeper.quorum</name>
<value>172.25.15.11:2181,172.25.15.12:2181,172.25.15.14:2181</value>
</property> 编辑hdfs-site.xml
[hadoop@server13 hadoop]$ cat hdfs-site.xml
<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
<!--
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License. See accompanying LICENSE file.
-->
<!-- Put site-specific property overrides in this file. -->
<configuration>
<property>
<name>dfs.replication</name>
<value>3</value>
</property>
<!-- 指定 hdfs 的 nameservices 为 masters,和 core-site.xml 文件中的设置保持一致 -->
<property>
<name>dfs.nameservices</name>
<value>masters</value>
</property>
<!-- masters 下面有两个 namenode 节点,分别是 h1 和 h2 (名称可自定义)-->
<property>
<name>dfs.ha.namenodes.masters</name>
<value>h1,h2</value>
</property>
<!-- 指定 h1 节点的 rpc 通信地址 -->
<property>
<name>dfs.namenode.rpc-address.masters.h1</name>
<value>172.25.15.13:9000</value>
</property>
<!-- 指定 h1 节点的 http 通信地址 -->
<property>
<name>dfs.namenode.http-address.masters.h1</name>
<value>172.25.15.13:9870</value>
</property>
<!-- 指定 h2 节点的 rpc 通信地址 -->
<property>
<name>dfs.namenode.rpc-address.masters.h2</name>
<value>172.25.15.15:9000</value>
</property>
<!-- 指定 h2 节点的 http 通信地址 -->
<property>
<name>dfs.namenode.http-address.masters.h2</name>
<value>172.25.15.15:9870</value>
</property>
<!-- 指定 NameNode 元数据在 JournalNode 上的存放位置 -->
<property>
<name>dfs.namenode.shared.edits.dir</name>
<value>qjournal://172.25.15.11:8485;172.25.15.12:8485;172.25.15.14:8485/masters</value>
</property>
<!-- 指定 JournalNode 在本地磁盘存放数据的位置 -->
<property>
<name>dfs.journalnode.edits.dir</name>
<value>/tmp/journaldata</value>
</property>
<!-- 开启 NameNode 失败自动切换 -->
<property>
<name>dfs.ha.automatic-failover.enabled</name>
<value>true</value>
</property>
<!-- 配置失败自动切换实现方式 -->
<property>
<name>dfs.client.failover.proxy.provider.masters</name>
<value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value>
</property>
<!-- 配置隔离机制方法,每个机制占用一行-->
<property>
<name>dfs.ha.fencing.methods</name>
<value>
sshfence
shell(/bin/true)
</value>
</property>
<!-- 使用 sshfence 隔离机制时需要 ssh 免密码 -->
<property>
<name>dfs.ha.fencing.ssh.private-key-files</name>
<value>/home/hadoop/.ssh/id_rsa</value>
</property>
<!-- 配置 sshfence 隔离机制超时时间 -->
<property>
<name>dfs.ha.fencing.ssh.connect-timeout</name>
<value>30000</value>
</property>
</configuration>
jps查看journalnode启动成功


格式化 HDFS 集群
将/tmp/hadoop-hadoop里的数据拷贝到server15的/tmp目录下,因为NN数据默认存放在/tmp目录下 
在server13上格式化 zookeeper (只需在 h1 上执行即可) 

server11作为查询窗口连接zookeeper
可以正常访问文件系统 查看当前美誉开启NN
server13启动 hdfs 集群(只需在 h1 上执行即可) 
启动完成后jps可以看到DFSZKFailoverController开启
server15查看DFSZKFailoverController开启
server11刚才已经连接了zookeeper,查看NN主备,可以看到server13是主namenode
在server13的hadoop管理页面也可以看到server13状态为活跃
server15 的状态为备用
server13新建/user/hadoop/input虚拟目录,上传/etc/hadoop/*.xml文件至input目录
查看input目录下上传的文件
登录server13的hadoop管理页面查看,可以正常访问/user/hadoop/input里的内容

而在server5的hadoop管理页面就无法查看目录内容

3、测试故障自动切换
杀掉 server13 主机的 namenode 进程后依然可以访问

server11查看NN主备,此时可以看到server15是主namenode

登录server15的hadoop管理页面查看 此时server15 转为 active 状态 
重新启动server13 上的 namenode

server13的hadoop管理页面现在可以正常访问 显示状态为备用 standby
server11再查看NN主备,可以看到server15仍是主namenode
二、 Yarn高可用
1、RM高可用部署
由于一个Yarn集群由一个ResourceManager节点和多个NodeManager节点组成,一旦ResourceManager节点宕机,那么YARN集群将不能进行资源的调度。

<?xml version="1.0"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
<!--
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License. See accompanying LICENSE file.
-->
<!-- Put site-specific property overrides in this file. -->
<configuration>
<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>
<property>
<name>mapreduce.application.classpath</name>
<value>$HADOOP_MAPRED_HOME/share/hadoop/mapreduce/*:$HADOOP_MAPRED_HOME/share/hadoop/mapreduce/lib/*</value>
</property>
</configuration><?xml version="1.0"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
<!--
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License. See accompanying LICENSE file.
-->
<!-- Put site-specific property overrides in this file. -->
<configuration>
<!-- 指定 yarn 为 MapReduce 的框架 -->
<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>
<property>
<name>mapreduce.application.classpath</name>
<value>$HADOOP_MAPRED_HOME/share/hadoop/mapreduce/*:$HADOOP_MAPRED_HOME/share/hadoop/mapreduce/lib/*</value>
</property>
</configuration>编辑 yarn-site.xml 文件
[hadoop@server13 hadoop]$ cat yarn-site.xml
<?xml version="1.0"?>
<!--
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License. See accompanying LICENSE file.
-->
<configuration>
<!-- 配置可以在 nodemanager 上运行 mapreduce 程序 -->
<property>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
</property>
<!-- 指定环境变量 -->
<property>
<name>yarn.nodemanager.env-whitelist</name>
<value>JAVA_HOME,HADOOP_COMMON_HOME,HADOOP_HDFS_HOME,HADOOP_CONF_DIR,CLASSPATH_PREPEND_DISTCACHE,HADOOP_YARN_HOME,HADOOP_MAPRED_HOME</value>
</property>
<!-- 激活 RM 高可用 -->
<property>
<name>yarn.resourcemanager.ha.enabled</name>
<value>true</value>
</property>
<!-- 指定 RM 的集群 id -->
<property>
<name>yarn.resourcemanager.cluster-id</name>
<value>RM_CLUSTER</value>
</property>
<!-- 定义 RM 的节点-->
<property>
<name>yarn.resourcemanager.ha.rm-ids</name>
<value>rm1,rm2</value>
</property>
<!-- 指定 RM1 的地址 -->
<property>
<name>yarn.resourcemanager.hostname.rm1</name>
<value>172.25.15.13</value>
</property>
<!-- 指定 RM2 的地址 -->
<property>
<name>yarn.resourcemanager.hostname.rm2</name>
<value>172.25.15.15</value>
</property>
<!-- 激活 RM 自动恢复 -->
<property>
<name>yarn.resourcemanager.recovery.enabled</name>
<value>true</value>
</property>
<!-- 配置 RM 状态信息存储方式,有 MemStore 和 ZKStore-->
<property>
<name>yarn.resourcemanager.store.class</name>
<value>org.apache.hadoop.yarn.server.resourcemanager.recovery.ZKRMStateStore</value>
</property>
<!-- 配置为 zookeeper 存储时,指定 zookeeper 集群的地址 -->
<property>
<name>yarn.resourcemanager.zk-address</name>
<value>172.25.15.11:2181,172.25.15.12:2181,172.25.15.14:2181</value>
</property>
</configuration>server13启动yarn服务,可以看到ResourceManager是server13和server15
在server13和server15上均可以看到ResourceManager进程
server11 12 14上均运行NodeManager进程
server11与zookeeper保持着连接,查看主备,可以看到rm1是主

浏览器访问server13的yarn资源管理页面,可以看到状态是activ
浏览器访问server15的yarn资源管理页面,查看状态是standby备用
2、RM高可用测试
server13查看RM进程的id,kill -9 杀死该进程
server11查看主备,可以看到rm2是主 
此时浏览器访问server13失败
浏览器访问server5的yarn资源管理页面,查看状态,现在变成了active活跃 
server13再重新开启RM进程 
server11查看主备,可以看到rm2仍然是主 
三、Hbase高可用
HBase是一个分布式的、面向列的开源数据库。HBase是Apache的Hadoop项目的子项目。HBase不同于一般的关系数据库,它是一个适合于非结构化数据存储的数据库。另一个不同的是HBase基于列的而不是基于行的模式。
HBase – Hadoop Database,是一个高可靠性、高性能、面向列、可伸缩的分布式存储系统,利用HBase技术可在廉价PC Server上搭建起大规模结构化存储集群。HBase是一个分布式的、面向列的开源数据库。HBase是Apache的Hadoop项目的子项目。HBase不同于一般的关系数据库,它是一个适合于非结构化数据存储的数据库。另一个不同的是HBase基于列的而不是基于行的模式。
HBase – Hadoop Database,是一个高可靠性、高性能、面向列、可伸缩的分布式存储系统,利用HBase技术可在廉价PC Server上搭建起大规模结构化存储集群。
真实主机将hbase包发送到server13的/root下 
主机修改文件权限 移动到hadoop用户下 
切换到hadoop用户下解压

进入hbase目录 再进入conf目录
编辑hbase-env.sh文件

编辑hbase-site.xml文件
[hadoop@server13 conf]$ cat hbase-site.xml
<?xml version="1.0"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
<!--
/**
*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
-->
<configuration>
<!-- 指定 region server 的共享目录,用来持久化 HBase。这里指定的 HDFS 地址
是要跟 core-site.xml 里面的 fs.defaultFS 的 HDFS 的 IP 地址或者域名、端口必须一致。 -->
<property>
<name>hbase.rootdir</name>
<value>hdfs://masters/hbase</value>
</property>
<!-- 启用 hbase 分布式模式 -->
<property>
<name>hbase.cluster.distributed</name>
<value>true</value>
</property>
<!-- Zookeeper 集群的地址列表,用逗号分割。默认是 localhost,是给伪分布式用
的。要修改才能在完全分布式的情况下使用。 -->
<property>
<name>hbase.zookeeper.quorum</name>
<value>172.25.15.11,172.25.15.12,172.25.15.14</value>
</property>
<!-- 指定 hbase 的 master -->
<property>
<name>hbase.master</name>
<value>h1</value>
</property>
</configuration>编辑regionservers文件,输入zk集群的节点ip 跟workers节点ip一致
启动 hbase 主节点运行
jps查看可以看到HMaster进程
server11、server12和server14可以看到本地运行HRegionServer进程作为集群节点
server15作为备用节点运行hbase,jps查看可以看到HMaster进程
浏览器访问server13的16010端口进入hbase管理页面,可以看到身份是Master,还可以看到集群节点server11、12、14和备用节点server15
server13进入hbase shell
创建test表 向test中插入数据 查看test内容
在主节点上 kill 掉 HMaster 进程后查看故障切换 
在shell中可以查看test表 
但浏览器访问server13失败
浏览器访问server15的16010端口进入hbase管理页面,可以看到现在server15是Master,备用主节点无内容 
server13重新启动hbase 
浏览器访问server13:16010端口 可以看到server13为备用
浏览器访问server15的16010端口进入hbase管理页面,可以看到server15仍然是Master,备用主节点为server13
