本案例软件包:链接:https://pan.baidu.com/s/1ighxbTNAWqobGpsX0qkD8w
提取码:lkjh(若链接失效在下面评论,我会及时更新)
搭建环境:hadoop-3.1.3,jdk1.8.0_162

一、HA模式简介

Hadoop的HA模式是在Hadoop全分布式基础上,利用ZooKeeper等协调工具配置的高可用Hadoop集群。
如果还没有配置全分布式的Hadoop和ZooKeeper可以去这三篇博客查看如何配置
Linux虚拟机的JDK和Hadoop安装Hadoop的完全分布式搭建
ZooKeeper的完全分布式

hadoop 集群空间 hadoop集群模式_HDFS

二、HDFS的HA模式

由于HDFS的HA模式搭建步骤较多,建议在搭建之前先对虚拟机master,slave01,slvae02拍摄快照,这样如果出现错误可以快速恢复。

1、修改master的/usr/local/hadoop/etc/hadoop/core-site.xml文件

cd /usr/local/hadoop/etc/hadoop/
sudo vim core-site.xml

将其中中的内容替换为如下内容

<!--指定文件系统的名称-->
    <property>
        <name>fs.defaultFS</name>
        <value>hdfs://ggb</value>
    </property>
<!--配置Hadoop运行产生的临时数据存储目录-->
    <property>
        <name>hadoop.tmp.dir</name>
        <value>file:/usr/local/hadoop/tmp</value>                 
        <description>Abase for other temporary directories.</description>
    </property>
<!--配置操作HDFS的缓存大小-->
    <property>
        <name>io.file.buffer.size</name>
        <value>4096</value>
    </property>
<!--指定自动故障转移的集群-->
    <property>
        <name>ha.zookeeper.quorum</name>
        <value>master:2181,slave01:2181,slave02:2181</value>
    </property>

2、修改master的hdfs-site.xml文件

sudo vim hdfs-site.xml

将其中中的内容替换为如下内容

<!--配置HDFS块的副本数(全分布式默认副本为3,最大副本512)-->
    <property>
        <name>dfs.replication</name>
        <value>3</value>
    </property>
<!--设置HDFS块的大小-->
    <property>
        <name>dfs.blocksize</name>
        <value>134217728</value>
    </property>
<!--配置HDFS元数据的存储目录-->
    <property>
        <name>dfs.namenode.name.dir</name>
        <value>file:/usr/local/hadoop/tmp/dfs/name</value>
    </property>
<!--配置HDFS真正的数据内容(数据块)的存储目录-->
    <property>
        <name>dfs.datanode.data.dir</name>
        <value>file:/usr/local/hadoop/tmp/dfs/data</value>
    </property>
<!--开启通过Web操作HDFS-->
    <property>
        <name>dfs.webhdfs.enabled</name>
        <value>true</value>
    </property>
<!--关闭HDFS文件的权限检查-->
    <property>
        <name>dfs.permissions.enabled</name>
        <value>false</value>
    </property>
<!--配置虚拟服务名-->
    <property>
        <name>dfs.nameservices</name>
        <value>ggb</value>
    </property>
<!--为虚拟服务指定两个NameNode(目前每个服务器最多两个NameNode)-->
    <property>
        <name>dfs.ha.namenodes.ggb</name>
        <value>nn1,nn2</value>
    </property>
<!--配置NameNode(nn1)的RPC地址-->
    <property>
        <name>dfs.namenode.rpc-address.ggb.nn1</name>
        <value>master:8020</value>
    </property>
<!--配置NameNode(nn2)的RPC地址-->
    <property>
        <name>dfs.namenode.rpc-address.ggb.nn2</name>
        <value>slave01:8020</value>
    </property>
<!--配置NameNode(nn1)的HTTP地址-->
    <property>
        <name>dfs.namenode.http-address.ggb.nn1</name>
        <value>master:50070</value>
    </property>
<!--配置NameNode(nn2)的HTTP地址-->
    <property>
        <name>dfs.namenode.http-address.ggb.nn2</name>
        <value>slave01:50070</value>
    </property>
<!--配置JournalNode通信地址-->
    <property>
        <name>dfs.namenode.shared.edits.dir</name>
        <value>qjournal://master:8485;slave01:8485;slave02:8485/ggb</value>
    </property>
<!--配置NameNode出现故障时,启用备用NameNode的代理-->
    <property>
        <name>dfs.client.failover.proxy.provider.ggb</name>
        <value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value>
    </property>
<!--配置自动故障转移-->
    <property>
        <name>dfs.ha.automatic-failover.enabled</name>
        <value>true</value>
    </property>
<!--配置防止脑裂的手段,shell脚本-->
    <property>
        <name>dfs.ha.fencing.methods</name>
        <value>shell(/bin/true)</value>
    </property>

3、将master的Hadoop目录分发到虚拟机slave01,slave02

sudo scp -r /usr/local/hadoop slave01:/usr/local
sudo scp -r /usr/local/hadoop slave02:/usr/local

在三台虚拟机分别给予权限

cd /usr/local
 sudo chown -R hadoop:hadoop ./hadoop

4、在虚拟机slave01上新建ssh公私密钥对

不了解可以先查看一下这篇博客里面详细写了ssh的免密登录Linux虚拟机下的Hadoop集群搭建之Xshell及Xftp的使用和SSH服务配置

ssh-keygen -t rsa
ssh-copy-id hadoop@master
ssh-copy-id hadoop@slave01
ssh-copy-id hadoop@slave02

5、将master的HDFS元数据的存储目录分发到slave01

由于在配置文件中我将HDFS的元数据存储目录放置在了Hadoop的安装路径下,所以这步省略,大家根据自身情况上传。

6、启动HDFS的HA模式

(1)首先启动ZooKeeper集群

xzk-start.sh

这是我自己写的脚本命令具体可以看ZooKeeper的全分布式安装和常见问题这篇文章的最后部分,正常的启动命令为分别在三台虚拟机执行

zkServer.sh start

(2)分别在三台虚拟机上启动JournalNode进程

hadoop-daemon.sh start journalnode

(3)对NameNode进行格式化

一定要先启动JournaNode进程,否则会出错。
首先删除Hadoop下的临时文件,防止NameNode后续启动不起来

cd /usr/local
sudo rm -rf ./hadoop/tmp
sudo rm -rf ./hadoop/logs/*

在这里要注意,先格式化一个namenode,再用另一台namenode同步先前那台namenode。

在master虚拟机执行如下命令

hdfs namenode -format
格式化之后启动namenode
hadoop-daemon.sh start namenode

在第二个namenode节点虚拟机即slave01执行如下命令

同步第一台namenode
hdfs namenode -bootstrapStandby
hadoop-daemon.sh start namenode

这时登录HDFS的web界面可以查看到都处于standby,手动切换nn1为强制激活。

hdfs haadmin -transitionToActive nn1
hdfs haadmin -transitionToActive --forcemanual nn1   //这里需要选择y
查看nn1,nn2状态
hdfs haadmin -getServiceState nn1
hdfs haadmin -getServiceState nn2

(4)在master上格式化ZooKeeper

hdfs zkfc -formatZK

(5)在master上初始化共享编辑日志

hdfs namenode -initializeShareEdits

(6)在master启动HDFS进程

hadoop.sh start

这里由于我的虚拟机之前进程无法使用命令同时全部启动,需要单个进程命令启动,所以编写一个一键启动脚本,具体看Hadoop一键启动脚本编写 正常启动命令

start-dfs.sh

如果出现以下进程,即为配置成功(由于我这里将yarn也启动了,对照的时候可以也将yarn启动,或者忽略yarn进程)

hadoop 集群空间 hadoop集群模式_hdfs_02


hadoop 集群空间 hadoop集群模式_HDFS_03


hadoop 集群空间 hadoop集群模式_大数据_04

(7)测试

使用命令查看nn1,nn2状态

hdfs haadmin -getServiceState nn1
hdfs haadmin -getServiceState nn2

当前nn1处于活跃状态,nn2处于备用状态

hadoop 集群空间 hadoop集群模式_大数据_05


也可以通过NameNode Web界面查看nn1,nn2状态。

通过输入http://192.168.64.133:50070

http://192.168.64.133:50070可查看nn2处于备用,nn1处于活跃。 如果在虚拟机外无法访问该网站,在虚拟机内置浏览器可以的话,可能没有关闭防火墙和修改hosts文件,关闭防火墙命令如下

sudo service iptables stop
sudo chkconfig iptables off

hosts文件在windows10的路径:C:\Windows\System32\drivers\etc

在最下面添加映射例如

hadoop 集群空间 hadoop集群模式_hadoop 集群空间_06

添加之后保存退出即可

hadoop 集群空间 hadoop集群模式_hadoop_07


hadoop 集群空间 hadoop集群模式_hdfs_08

(8)验证

使用jps命令在master查看NameNode的进程ID

hadoop 集群空间 hadoop集群模式_HDFS_09


hadoop 集群空间 hadoop集群模式_hadoop 集群空间_10

使用kill命令强制关闭NameNode进程,使nn1出现故障

kill -9 5439

在master上查看nn2的状态,nn2已切换为活跃状态

hadoop 集群空间 hadoop集群模式_大数据_11


再次启动nn1,查看状态

hadoop 集群空间 hadoop集群模式_hdfs_12


使用kill命令强制关闭NameNode进程,使nn2出现故障

查看nn1状态,nn1已切换到活跃状态(可能会等待几秒钟)

hadoop 集群空间 hadoop集群模式_HDFS_13

再次启动nn2,查看状态

hadoop 集群空间 hadoop集群模式_HDFS_14

NameNode的HA模式配置成功!!!!

三、yarn的HA模式

首先确保Hadoop集群和ZooKeeper集群处于关闭状态

1、修改虚拟机master的yarn-site.xml文件

cd /usr/local/hadoop/etc/hadoop/
sudo vim yarn-site.xml

将内容修改为

<!--配置NodeManager启动时加载Shuffle服务-->
    <property>
        <name>yarn.nodemanager.aux-services</name>
        <value>mapreduce_shuffle</value>
    </property>
<!--启动yarn ResourceManager的HA模式-->
    <property>
        <name>yarn.resourcemanager.ha.enabled</name>
        <value>true</value>
    </property>
<!--配置yarn ResourceManager的集群ID-->
    <property>
        <name>yarn.resourcemanager.cluster-id</name>
        <value>ggb</value>
    </property>
<!--指定yarn ResourceManager实现HA的节点名称-->
    <property>
        <name>yarn.resourcemanager.ha.rm-ids</name>
        <value>rm1,rm2</value>
    </property>
<!--配置启动rm1的主机为虚拟机master-->
    <property>
        <name>yarn.resourcemanager.hostname.rm1</name>
        <value>master</value>
    </property>
<!--配置启动rm2的主机为虚拟机slave01-->
    <property>
        <name>yarn.resourcemanager.hostname.rm2</name>
        <value>slave01</value>
    </property>

<!--配置rm1的web地址-->
    <property>
        <name>yarn.resourcemanager.webapp.address.rm1</name>
        <value>master:8088</value>
    </property>
<!--配置rm2的web地址-->
    <property>
        <name>yarn.resourcemanager.webapp.address.rm2</name>
        <value>slave01:8088</value>
    </property>
<!--配置zookeeper集群地址-->
   <property>
        <name>yarn.resourcemanager.zk-address</name>
        <value>master:2181,slave01:2181,slave02: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>
  <!--日志聚合-->
  <property>
       <name>yarn.log-aggregation-enable</name>
       <value>true</value>
  </property>
<!--任务历史服务-->
  <property>
       <name>yarn.log.server.url</name>
       <value>http://master:19888/jobhistory/logs/</value>
  </property>
  <property>
       <name>yarn.log-aggregation.retain-seconds</name>
       <value>86400</value>
  </property>

2、将master的yarn文件分发到虚拟机slave01,slave02

sudo scp -r yarn-site.xml slave01:/usr/local/hadoop/etc/hadoop
sudo scp -r yarn-site.xml slave02:/usr/local/hadoop/etc/hadoop

3、查看进程

先启动ZooKeeper,再启动YARN进程

xzk-start.sh //我自己写的脚本命令
start-yarn.sh

hadoop 集群空间 hadoop集群模式_hadoop 集群空间_15


出现如下进程,即master,slave01均有resourcemanager进程

查看rm1,rm2状态

yarn rmadmin -getServiceState rm1
yarn rmadmin -getServiceState rm2

hadoop 集群空间 hadoop集群模式_hadoop_16

当前rm1为活跃,rm2为备用

访问web页面

hadoop 集群空间 hadoop集群模式_hdfs_17


hadoop 集群空间 hadoop集群模式_大数据_18

4、验证自动故障转移

首先使用jps查看master虚拟机中resourcemanager的进程ID

hadoop 集群空间 hadoop集群模式_大数据_19


使用kill命令强制关闭进程

kill -9 9433

查看rm2的状态

hadoop 集群空间 hadoop集群模式_hadoop 集群空间_20


在几秒钟后rm2由备用转为活跃状态

重新启动rm1,kill掉rm2尝试

在slave01节点执行jps查询进程ID,使用kill命令强制关闭进程,与上面步骤一样,等待几秒查看rm1,rm2状态

hadoop 集群空间 hadoop集群模式_大数据_21


自此!!!YARN的HA模式配置成功!!!

四、启动和关闭Hadoop的HA模式的注意事项

1、启动

启动Hadoop集群的HA模式,需要在master虚拟机上,先启动ZooKeeper集群,后启动Hadoop集群
如下

xzk-start.sh
hadoop.sh start
以上为我自己写的脚本,正常启动为
分别在三台机器执行
zkServer.sh start
然后在主节点master执行
start-dfs.sh
start-yarn.sh

执行结果如下

hadoop 集群空间 hadoop集群模式_hdfs_22


hadoop 集群空间 hadoop集群模式_hadoop 集群空间_23


hadoop 集群空间 hadoop集群模式_大数据_24


各进程与最开始我们对集群的规划相匹配

hadoop 集群空间 hadoop集群模式_hadoop 集群空间_25

2、关闭

为确保稳定,在关闭时我们要倒着关闭集群,也就是说先关闭Hadoop的HA模式,再关闭ZooKeeper集群

hadoop 集群空间 hadoop集群模式_hadoop_26

自此,Hadoop的HA模式全部配置成功!!!