一,HA的架构
Hadoop HA 即Hadoop的高可用,不同于普通的namenode+second namenode的模式,second namenode只能作为namenode的冷备份,当namenode挂掉后,second namenode不能自动充当namenode的角色。所以为了保证高可用性,就有了Hadoop HA的机制。
hdfs HA中即有至少有两个namenode,这儿以两个namenode为例,一个可以对外提供服务的namenode成为active namenode,待命状态的namenode成为standby namenode。
1.如何做到两个namenode的元数据的一致性呢?
将edits文件托管给稳定的第三方存放(当然,为了防止第三方挂掉,namenode本地的edits文件也是必要的),standby namenode就可以定时去第三方取edits文件放在内存中,做元素据的修改。这样就可以保证actice 和standby的数据一致性。
2.第三方用什么才能保证高可用?
第三方用的是qjournal集群,集群就可以将edits文件存放在每个机器中。并且这个集群使用zookeeper作为集群的协调,保证数据写入一半以上的机器,才为写入成功。
3.怎么做到standby在active节点挂掉自动充当active的角色呢?
这儿在每个namenode对应着一个监控进程ZKFC。在active上ZKFC使用RPC调用以判断active是否挂掉,如果挂掉,那么在zookeeper上将相应的节点删除(分布式锁),在Standby节点上的ZKFC进程就可以感知到节点删除的信息。Standby节点上的ZKFC进程感知到active节点挂掉的信息之后会向active节点发送一个杀死hdfs namenode的命令,确保active死亡,然后再向standby发送切换的指令,并向zookeeper创建节点。这样就可以让standby模式转换为active模式。
对于resourceManager的HA,因为不存在数据的一致性,所以只需要向zookeeper创建节点(获得分布式锁)即可。
二,环境准备
1.节点角色搭配(这儿是7台节点)
hadoop1:NameNode ZKFC
hadoop2:NameNode ZKFC
hadoop3:ResourceManager
hadoop4:ResourceManager
hadoop5:DataNode NodeManager zookeeper JournalNode
hadoop6:DataNode NodeManager zookeeper JournalNode
hadoop7:DataNode NodeManager zookeeper JournalNode
2.每台机器上都需要安装hadoop和jdk
3.节点之间的免密登陆,以及hosts文件的相应映射配置好
4.hadoop5,hadoop6,hadoop7上需要安装zookeeper
三,配置文件及解析
1.首先需要在hadoop-env.sh中加上HADOOP_HOME
2.core-site.xml
<!-- 这儿的bi表示两个namenode组建成的逻辑名字 -->
<property>
<name>fs.defaultFS</name>
<value>hdfs://bi/</value>
</property>
<!-- 指定hadoop临时目录 -->
<property>
<name>hadoop.tmp.dir</name>
<value>/home/hadoop/hadoopdata</value>
</property>
<!-- 指定zookeeper地址 -->
<property>
<name>ha.zookeeper.quorum</name>
<value>hadoop5:2181,hadoop6:2181,hadoop7:2181</value>
</property>
3.hdfs-site.xml
<configuration>
<!--指定hdfs的nameservice为bi,需要和core-site.xml中的保持一致 -->
<property>
<name>dfs.nameservices