赞
踩
HA
( High Available
)即高可用(7*24小时不中断服务),实现高可用最关键的策略就是消除单点故障。 HA
严格地来说应该分成各个组件的 HA
机制, HDFS
的 HA
和 YARN
的 HA
。
Hadoop2.0
之前,在 HDFS
集群中 NameNode
存在单点故障( SPOF
)。 NameNode
主要在以下两个方面影响 HDFS
集群:
NameNode
机器发生意外,如宕机,集群将无法使用,直到管理员重启NameNode
机器需要升级,包括软件、硬件升级,此时集群也将无法使用HDFS HA
功能通过配置 Active/Standby
两个 NameNodes
实现在集群中对 NameNode
的热备来解决上述问题。如果出现故障,如机器崩溃或机器需要升级维护,这时可通过此种方式将 NameNode
很快的切换到另外一台机器。
通过双 NameNode
消除单点故障
Edit
日志只有 Active
状态的 NameNode
节点才可以做写操作,两个 NameNode
都可以读取 Edits
。共享的 Edits
放在一个共享存储中管理( qjournal
和 NFS
两个主流实现)zkfailover
常驻在每一个 NameNode
所在的节点,每一个 zkfailover
负责监控自己所在 NameNode
节点,利用 ZooKeeper
进行状态标识,当需要进行状态切换时,由 zkfailover
来负责切换,切换时需要防止 brain split
现象的发生。NameNode
之间能够 ssh
无密码登录Fence
),即同一时刻仅仅有一个 NameNode
对外提供服务使用命令 hdfs haadmin failover
手动进行故障转移,在该模式下,即使现役 NameNode
已经失效,系统也不会自动从现役 NameNode
转移到待机 NameNode
,下面学习如何配置部署 HA
自动进行故障转移。
自动故障转移为 HDFS
部署增加了两个新组件: ZooKeeper
和 ZKFailoverController
( ZKFC
)进程。
如图所示: ZooKeeper
是维护少量协调数据,通知客户端这些数据的改变和监视客户端故障的高可用服务。 HA
的自动故障转移依赖于 ZooKeeper
的以下功能:
①故障检测 :集群中的每个 NameNode
在 ZooKeeper
中维护了一个持久会话,如果机器崩溃, ZooKeeper
中的会话将终止, ZooKeeper
通知另一个 DataNode
需要触发故障转移。
②现役 NameNode
选择: ZooKeeper
提供了一个简单的机制用于唯一的选择一个节点为 active
状态。如果目前现役 NameNode
崩溃,另一个节点可能从 ZooKeeper
获得特殊的排外锁以表明它应该称为现役 NameNode
。
ZKFC
是自动故障转移的另一个新组件,是 ZooKeeper
的客户端,也监视和管理 NameNode
的状态。每个运行 NameNode
的主机也运行一个 ZKFC
进程, ZKFC
负责:
①健康监测: ZKFC
使用一个健康检查命令定期地 ping
与之在相同主机的 NameNode
,只要该 NameNode
及时地回复健康状态, ZKFC
认为该节点是健康的。如果该节点崩溃,冻结或进入不健康状态,健康监测器标识该节点为非健康的。
②ZooKeeper会话管理: 当本地 NameNode
是健康的, ZKFC
保持一个在 ZooKeeper
中打开的会话。如果本地 NameNode
处于 active
状态, ZKFC
也保持一个特殊的 znode
锁,该锁使用了 ZooKeeper
对短暂节点的支持,如果会话终止,锁节点将自动删除。
③基于ZooKeeper的选择: 如果本地 NameNode
是健康的,且 ZKFC
发现没有其它的节点当前持有 znode
锁,它将为自己获取该锁。如果成功,则它已经赢得了选择,并负责运行故障转移进程以使它的本地 NameNode
为 Active
。故障转移进程与前面描述的手动故障转移相似,首先如果必要保护之前的现役 NameNode
,然后本地 NameNode
转换为 Active
状态。
ZooKeeper
集群和完全分布运行模式 Hadoop
集群的搭建。
JournalNode:两个 NameNode
为了数据同步,会通过一组称作 JournalNodes
的独立进程进行相互通信。
hadoop100hadoop101hadoop1042NameNodeNameNodeJournalNodeJournalNodeJournalNodeDataNodeDataNodeDataNodeZooKeeperZKZKResourceManagerResourceManagerSecondaryNameNodeNodeManagerNodeManagerNodeManager
①拷贝之前的 Hadoop
文件到 HA
文件夹
[root@hadoop100 hadoop-2.7.2]
②配置 core-site.xml
<property>
<name>fs.defaultFSname>
<value>hdfs://myclustervalue>
property>
<property>
<name>hadoop.tmp.dirname>
<value>/opt/module/HA/hadoop-2.7.2/data/tmpvalue>
property>
③配置 hdfs-site.xml
<property>
<name>dfs.nameservicesname>
<value>myclustervalue>
property>
<property>
<name>dfs.ha.namenodes.myclustername>
<value>nn1,nn2value>
property>
<property>
<name>dfs.namenode.rpc-address.mycluster.nn1name>
<value>hadoop100:9000value>
property>
<property>
<name>dfs.namenode.rpc-address.mycluster.nn2name>
<value>hadoop101:9000value>
property>
<property>
<name>dfs.namenode.http-address.mycluster.nn1name>
<value>hadoop100:50070value>
property>
<property>
<name>dfs.namenode.http-address.mycluster.nn2name>
<value>hadoop101:50070value>
property>
<property>
<name>dfs.namenode.shared.edits.dirname>
<value>qjournal://hadoop100:8485;hadoop101:8485;hadoop102:8485/myclustervalue>
property>
<property>
<name>dfs.ha.fencing.methodsname>
<value>sshfencevalue>
property>
<property>
<name>dfs.ha.fencing.ssh.private-key-filesname>
<value>/root/.ssh/id_rsavalue>
property>
<property>
<name>dfs.journalnode.edits.dirname>
<value>/opt/module/HA/hadoop-2.7.2/data/jnvalue>
property>
<property>
<name>dfs.permissions.enablename>
<value>falsevalue>
property>
<property>
<name>dfs.client.failover.proxy.provider.myclustername>
<value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvidervalue>
property>
④分发HA
[root@hadoop100 HA]
①在各个节点上启动 JournalNode
服务
[root@hadoop100 hadoop-2.7.2]
②在 nn1
上,对其进行格式化并启动
[root@hadoop100 hadoop-2.7.2]
[root@hadoop100 hadoop-2.7.2]
③在 nn2
上,同步 nn1
的元数据信息
[root@hadoop101 hadoop-2.7.2]
④启动 nn2
[root@hadoop101 hadoop-2.7.2]
⑤将 nn1
切换为 Active
[root@hadoop100 hadoop-2.7.2]
⑥查看是否 Active
[root@hadoop100 hadoop-2.7.2]
①具体配置
【 hdfs-site.xml
】
<property>
<name>dfs.ha.automatic-failover.enabledname>
<value>truevalue>
property>
【 core-site.xml
】
<property>
<name>ha.zookeeper.quorumname>
<value>hadoop102:2181,hadoop103:2181,hadoop104:2181value>
property>
②关闭所有 HDFS
服务
[root@hadoop100 hadoop-2.7.2]
③启动 ZooKeeper
集群
[root@hadoop100 hadoop-2.7.2]
[root@hadoop100 hadoop-2.7.2]
if (($
then
exit 1;
fi
for i in hadoop100 hadoop101 hadoop102
do
echo Starting zk in $i
ssh $i "source /etc/profile && /opt/module/zookeeper-3.4.10/bin/zkServer.sh $1" > /dev/null
done
④初始化 HA
在 Zookeeper
中状态
[root@hadoop100 hadoop-2.7.2]
⑤启动 HDFS
服务
[root@hadoop100 hadoop-2.7.2]
⑥验证:杀死 NameNode
进程
[root@hadoop100 hadoop-2.7.2]
杀死 nn1
后,此时 NamaNode
已经切换为 nn2
通过查看 zkfc
的日志,可以发现没有 fuser
命令,安装 fuser
命令后重启 HDFS
后即能完成故障转移
规划集群:
hadoop100hadoop101hadoop1042NameNodeNameNodeJournalNodeJournalNodeJournalNodeDataNodeDataNodeDataNodeZooKeeperZKZKResourceManagerResourceManagerSecondaryNameNodeNodeManagerNodeManagerNodeManager
具体配置:
①配置【 yarn-site.xml
】
<property>
<name>yarn.nodemanager.aux-servicesname>
<value>mapreduce_shufflevalue>
property>
<property>
<name>yarn.resourcemanager.ha.enabledname>
<value>truevalue>
property>
<property>
<name>yarn.resourcemanager.cluster-idname>
<value>cluster-yarn1value>
property>
<property>
<name>yarn.resourcemanager.ha.rm-idsname>
<value>rm1,rm2value>
property>
<property>
<name>yarn.resourcemanager.hostname.rm1name>
<value>hadoop100value>
property>
<property>
<name>yarn.resourcemanager.hostname.rm2name>
<value>hadoop101value>
property>
<property>
<name>yarn.resourcemanager.zk-addressname>
<value>hadoop100:2181,hadoop101:2181,hadoop102:2181value>
property>
<property>
<name>yarn.resourcemanager.recovery.enabledname>
<value>truevalue>
property>
<property>
<name>yarn.resourcemanager.store.classname>
<value>org.apache.hadoop.yarn.server.resourcemanager.recovery.ZKRMStateStorevalue>
property>
②同步更新其他节点的配置信息
③启动YARN
[root@hadoop100 hadoop-2.7.2]
[root@hadoop101 hadoop-2.7.2]
[root@hadoop101 hadoop-2.7.2]
active
[root@hadoop101 hadoop-2.7.2]
standby
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。