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。
将edits文件托管给稳定的第三方存放(当然,为了防止第三方挂掉,namenode本地的edits文件也是必要的),standby namenode就可以定时去第三方取edits文件放在内存中,做元素据的修改。这样就可以保证actice 和standby的数据一致性。
第三方用的是qjournal集群,集群就可以将edits文件存放在每个机器中。并且这个集群使用zookeeper作为集群的协调,保证数据写入一半以上的机器,才为写入成功。
这儿在每个namenode对应着一个监控进程ZKFC。在active上ZKFC使用RPC调用以判断active是否挂掉,如果挂掉,那么在zookeeper上将相应的节点删除(分布式锁),在Standby节点上的ZKFC进程就可以感知到节点删除的信息。Standby节点上的ZKFC进程感知到active节点挂掉的信息之后会向active节点发送一个杀死hdfs namenode的命令,确保active死亡,然后再向standby发送切换的指令,并向zookeeper创建节点。这样就可以让standby模式转换为active模式。
对于resourceManager的HA,因为不存在数据的一致性,所以只需要向zookeeper创建节点(获得分布式锁)即可。
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
<property>
<name>fs.defaultFSname>
<value>hdfs://bi/value>
property>
<property>
<name>hadoop.tmp.dirname>
<value>/home/hadoop/hadoopdatavalue>
property>
<property>
<name>ha.zookeeper.quorumname>
<value>hadoop5:2181,hadoop6:2181,hadoop7:2181value>
property>
<configuration>
<property>
<name>dfs.nameservicesname>
<value>bivalue>
property>
<property>
<name>dfs.ha.namenodes.biname>
<value>nn1,nn2value>
property>
<property>
<name>dfs.namenode.rpc-address.bi.nn1name>
<value>hadoop1:9000value>
property>
<property>
<name>dfs.namenode.http-address.bi.nn1name>
<value>hadoop1:50070value>
property>
<property>
<name>dfs.namenode.rpc-address.bi.nn2name>
<value>hadoop2:9000value>
property>
<property>
<name>dfs.namenode.http-address.bi.nn2name>
<value>hadoop2:50070value>
property>
<property>
<name>dfs.namenode.shared.edits.dirname>
<value>qjournal://hadoop5:8485;hadoop6:8485;hadoop7:8485/bivalue>
property>
<property>
<name>dfs.journalnode.edits.dirname>
<value>/home/hadoop/qjournalvalue>
property>
<property>
<name>dfs.ha.automatic-failover.enabledname>
<value>truevalue>
property>
<property>
<name>dfs.client.failover.proxy.provider.biname>
<value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvidervalue>
property>
<property>
<name>dfs.ha.fencing.methodsname>
<value>
sshfence
shell(/bin/true)
value>
property>
<property>
<name>dfs.ha.fencing.ssh.private-key-filesname>
<value>/root/.ssh/id_rsavalue>
property>
<property>
<name>dfs.ha.fencing.ssh.connect-timeoutname>
<value>30000value>
property>
configuration>
<configuration>
<property>
<name>mapreduce.framework.namename>
<value>yarnvalue>
property>
configuration>
<configuration>
<property>
<name>yarn.resourcemanager.ha.enabledname>
<value>truevalue>
property>
<property>
<name>yarn.resourcemanager.cluster-idname>
<value>yrcvalue>
property>
<property>
<name>yarn.resourcemanager.ha.rm-idsname>
<value>rm1,rm2value>
property>
<property>
<name>yarn.resourcemanager.hostname.rm1name>
<value>hadoop3value>
property>
<property>
<name>yarn.resourcemanager.hostname.rm2name>
<value>hadoop4value>
property>
<property>
<name>yarn.resourcemanager.zk-addressname>
<value>hadoop5:2181,hadoop6:2181,hadoop7:2181value>
property>
<property>
<name>yarn.nodemanager.aux-servicesname>
<value>mapreduce_shufflevalue>
property>
configuration>
hadoop5
hadoop6
hadoop7
zkServer.sh start
hadoop-daemon.sh start journalnode
hdfs namenode -format
注意:格式化完成之后,为了保证两个namenode的数据一致,需要把hadoop1的namenode的数据目录复制到hadoop2的相应的目录下
hdfs zkfc -formatZK
start-dfs.sh
start-yarn.sh
注意:在hadoop3上启动yarn后,hadoop4上没有resourcemanager进程,需要自动启动,指令如下
yarn-daemon.sh start resourcemanager