若HDFS集群中只配置了一个NameNode,那么当该NameNode所在的节点宕机,则整个HDFS就不能进行文件的上传和下载。
若YARN集群中只配置了一个ResourceManager,那么当该ResourceManager所在的节点宕机,则整个YARN就不能进行任务的计算。
*Hadoop依赖Zookeeper进行各个模块的HA配置,其中状态为Active的节点对外提供服务,而状态为StandBy的节点则只负责数据的同步,在必要时提供快速故障转移。
Hadoop各个模块剖析:https://www.cnblogs.com/funyoung/p/9889719.html
Hadoop集群管理:https://www.cnblogs.com/funyoung/p/9920828.html
2.HDFS HA集群
2.1 模型
当有两个NameNode时,提供哪个NameNode地址给客户端?
1.Hadoop提供了NameService进程,其是NameNode的代理,维护NameNode列表并存储NameNode的状态,客户端直接访问的是NameService,NameService会将请求转发给当前状态为Active的NameNode。
2.当启动HDFS时,DataNode将同时向两个NameNode进行注册。
怎样发现NameNode无法提供服务以及如何进行NameNode间状态的切换?
1.Hadoop提供了FailoverControllerActive和FailoverControllerStandBy两个进程用于NameNode的生命监控。
2.FailoverControllerActive和FailoverControllerStandBy会分别监控对应状态的NameNode,若NameNode无异常则定期向Zookeeper集群发送心跳,若在一定时间内Zookeeper集群没收到FailoverControllerActive发送的心跳,则认为此时状态为Active的NameNode已经无法对外提供服务,因此将状态为StandBy的NameNode切换为Active状态。
NameNode之间的数据如何进行同步和共享?
1.Hadoop提供了JournalNode用于存放NameNode中的编辑日志。
2.当激活的NameNode执行任何名称空间上的修改时,它将修改的记录保存到JournalNode集群中,备用的NameNode能够实时监控JournalNode集群中日志的变化,当监控到日志发生改变时会将其同步到本地。
*当状态为Active的NameNode无法对外提供服务时,Zookeeper将会自动的将处于StandBy状态的NameNode切换成Active。
2.2 HDFS HA高可用集群搭建
1.安装并配置Zookeeper集群
https://www.cnblogs.com/funyoung/p/8778106.html
2.配置HDFS(hdfs-site.xml)
<configuration> <!-- 指定NameService的名称 --> <property> <name>dfs.nameservices</name> <value>mycluster</value> </property> <!-- 指定NameService下两个NameNode的名称 --> <property> <name>dfs.ha.namenodes.mycluster</name> <value>nn1,nn2</value> </property> <!-- 分别指定NameNode的RPC通讯地址 --> <property> <name>dfs.namenode.rpc-address.mycluster.nn1</name> <value>192.168.1.80:8020</value> </property> <property> <name>dfs.namenode.rpc-address.mycluster.nn2</name> <value>192.168.1.81:8020</value> </property> <!-- 分别指定NameNode的Web监控页面地址 --> <property> <name>dfs.namenode.http-address.mycluster.nn1</name> <value>192.168.1.80:50070</value> </property> <property> <name>dfs.namenode.http-address.mycluster.nn2</name> <value>192.168.1.81:50070</value> </property> <!-- 指定NameNode编辑日志存储在JournalNode集群中的目录--> <property> <name>dfs.namenode.shared.edits.dir</name> <value>qjournal://192.168.1.80:8485;192.168.1.81:8485;192.168.1.82:8485/mycluster</value> </property> <!-- 指定JournalNode集群存放日志的目录--> <property> <name>dfs.journalnode.edits.dir</name> <value>/usr/hadoop/hadoop-2.9.0/journalnode</value> </property> <!-- 配置NameNode失败自动切换的方式--> <property> <name>dfs.client.failover.proxy.provider.mycluster</name> <value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</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>/root/.ssh/id_rsa</value> </property> <!-- 开启失败故障自动转移--> <property> <name>dfs.ha.automatic-failover.enabled</name> <value>true</value> </property> <!-- 配置Zookeeper地址--> <property> <name>ha.zookeeper.quorum</name> <value>192.168.1.80:2181,192.168.1.81:2181,192.168.1.82:2181</value> </property> <!-- 文件在HDFS中的备份数(小于等于NameNode) --> <property> <name>dfs.replication</name> <value>3</value> </property> <!-- 关闭HDFS的访问权限 --> <property> <name>dfs.permissions.enabled</name> <value>false</value> </property> <!-- 指定一个配置文件,使NameNode过滤配置文件中指定的host --> <property> <name>dfs.hosts.exclude</name> <value>/usr/hadoop/hadoop-2.9.0/etc/hadoop/hdfs.exclude</value> </property> </configuration>