原理
1、如何保证两个NameNode之间的数据同步?
active namenode记录日志的时候,需要往外部存储系统(qjounal)中记录一份,然后standby NameNode从qjounal中读取数据,然后进行checkpoint(也就是不再需要sandary NameNode)。
这个qjounal是一个分布式的外部存储系统,它借助于zookeeper框架实现。里面的选举也是利用了zookeeper的机制。
2、两个NameNode之间的状态如何切换?
写了一个zkfc(基于zookeeper的failover controller)的模块实现切换功能。每个NameNode的机器上都安装一个zkfc,他们也借助于zookeeper。
如果在状态为active的NameNode机器上的zkfc如果检测到NameNode进程不存在了,就会向zookeeper更新信息,然后处于standby端的zkfc首先是通过ssh发送一个kill -9 | grep namenode 的命令去杀死原本active的NameNode,以确保它真正失效(由于NameNode可能因为full GC是的它短暂失效),这样可以防止脑裂。
收到ssh命令的响应后,zkfc通过rpc去调用standby这边的NameNode的接口,更改他的状态为active,这样他就可以进行状态的切换了。
如果很久都没有收到ssh命令的响应,比如原本activeNameNode这边机器死机了,没有响应,或者网络短期阻塞没有响应等等,这个时候还有一个解决方案,就是需要用户提供一个脚本,这个zkfc帮忙调用去处理一些逻辑:是的原本active的NameNode机器断电等等。最后去切换本机的NameNode为active。
安装步骤:(其实就是修改一下配置文件就可以了)
-
1、core.site.xml
fs.defaultFS viewfs:/// fs.viewfs.mounttable.default.link./bi hdfs://bi/ fs.viewfs.mounttable.default.link./dt hdfs://dt/ hadoop.tmp.dir /home/hadoop/apps/hdpdata/ ha.zookeeper.quorum mini5:2181,mini6:2181,mini7:2181 -
2、hdfs.site.xml
dfs.nameservices bi,dt dfs.ha.namenodes.bi nn1,nn2 dfs.ha.namenodes.dt nn3,nn4 dfs.namenode.rpc-address.bi.nn1 mini1:9000 dfs.namenode.http-address.bi.nn1 mini1:50070 dfs.namenode.rpc-address.bi.nn2 mini2:9000 dfs.namenode.http-address.bi.nn2 mini2:50070 dfs.namenode.rpc-address.dt.nn3 mini3:9000 dfs.namenode.http-address.dt.nn3 mini3:50070 dfs.namenode.rpc-address.dt.nn4 mini4:9000 dfs.namenode.http-address.dt.nn4 mini4:50070 dfs.namenode.shared.edits.dir qjournal://mini5:8485;mini6:8485;mini7:8485/bi dfs.namenode.shared.edits.dir qjournal://mini5:8485;mini6:8485;mini7:8485/dt dfs.journalnode.edits.dir /home/hadoop/apps/hdpdata/journaldata dfs.ha.automatic-failover.enabled true dfs.client.failover.proxy.provider.bi org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider dfs.client.failover.proxy.provider.dt org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider dfs.ha.fencing.methods sshfence shell(/bin/true) dfs.ha.fencing.ssh.private-key-files /home/hadoop/.ssh/id_rsa dfs.ha.fencing.ssh.connect-timeout 30000 -
3、mapreduce.site.xml
mapreduce.framework.name yarn -
4、yarn.site.xml(也是做HA的)
yarn.resourcemanager.ha.enabled true yarn.resourcemanager.cluster-id yrc yarn.resourcemanager.ha.rm-ids rm1,rm2 yarn.resourcemanager.hostname.rm1 mini3 yarn.resourcemanager.hostname.rm2 mini4 yarn.resourcemanager.zk-address mini5:2181,mini6:2181,mini7:2181 yarn.nodemanager.aux-services mapreduce_shuffle