Hadoop HA概述
工作要点
- 通过双NameNode消除单点故障
- 元数据管理方式需要改变:内存中各自保存一份元数据;Edits 日志只有 Active 状态的NameNode节点可以做写操作;两个
NameNode都可以读取 Edits;共享的Edits放在一个共享存储中管理(qjournal 和 NFS 两个主流实现);
- 需要一个状态管理功能模块:实现了一个zkfailover ,常驻在每一个 NameNode 所在的节点,每一个 zkfailover 负责监
控自己所在NameNode节点,利用 zk 进行状态标识,当需要进行状态切换时,由 zkfailover来负责切换,切换时需要防止 brain split 现象的发生。
- 必须保证两个 NameNode 之间能够 ssh 无密码登录;
- 隔离(Fence),即同一时刻仅仅有一个 NameNode 对外提供服务
HDSF HA自动故障转移机制
- 使用两个新组件:ZooKeeper,ZKFailoverController(zkfc)进程
- HA依赖于ZooKeeper的以下功能:
- Failure detection,故障检测:集群中的每个 NameNode 在 ZooKe eper 中维护了一个持久会话,如果机器崩溃, ZooKeeper 中的会话将终止, ZooKeeper 通知另一个 NameNode 需要触发故障转移。
- Active NameNode election,现役NameNode选择:ZooKeeper 提供了一个简单的机制用于唯一的选择一个节点为 active 状态。如果目前现役 NameNode 崩溃,另一个节点可能从 ZooKeeper 获得特殊的排外锁以表明它应该成为现役 NameNode。
- zkfc是ZooKeeper的客户端,监视和管理NameNode的状态,每个NameNode运行一个akfc进程,负责:
- Health monitoring,健康检测:使用一个健康检测命令定期的ping与与之在相同主机的NameNode,只要NameNode及时的回复健康状态,zkfc则认为改节点是健康的,认为该节点是健康的。如果该节点崩溃,冻结或进入不健康状态,健康监测器标识该节点为非健康的。
- ZooKeeper session management ,ZooKeeper会话管理:当本地 NameNode是健康的, ZKFC保持一个在 ZooKeeper中打开的会话。如果本地 NameNode 处于 active 状态, ZKFC也保持一个特殊的 znode 锁,该锁使用了 ZooKeeper 对短暂 节点的支持,如果会话终止,锁节点将自动删除。
- ZooKeeper-based election,基于 ZooKeeper 的选择: 如果本地 NameNode 是健康的,且 ZKFC 发现没有其它的
节点当前持有 znode 锁,它将为自己获取该锁。如果成功,则它已经赢得了选择,并负责运行故障转移进程以使它的本地 NameNode 为 A ctive 。故障转移 进程 与前面描述的手动故障转移相似,首先如果必要保护之前的现役 NameNode ,然后本地 NameNode 转换为 Active 状态。
HDFS HA配置
集群规划
localhost102
localhost103
localhost104
NameNode
NameNode
JournalNode
JournalNode
JournalNode
DataNode
DataNode
DataNode
ZK
ZK
ZK
ResourceManager
ResourceManager
NodeManager
NodeManager
NodeManager
配置ZooKeeper集群
- 解压,创建zkData目录,添加myid文件
- 修改conf/zoo.cfg,添加集群信息server.A=B:C:D,A是节点myid,B是主机名,C是通信端口2888,D是选举端口3888
- 启动集群:bin/zkServer.sh start,启动客户端:bin/zkCli.sh
配置HDFS HA集群(手动故障转移)
配置core-site.xml
fs.defaultFS
hdfs://mycluster
hadoop.tmp.dir
/opt/module/HA/hadoop-2.7.2/data/tmp
dfs.journalnode.edits.dir
/opt/module/HA/hadoop-2.7.2/data/tmp/jn
配置hdfs-site.xml
dfs.nameservices
mycluster
dfs.ha.namenodes.mycluster
nn1,nn2
dfs.namenode.rpc-address.mycluster.nn1
localhost102:8020
dfs.namenode.rpc-address.mycluster.nn2
localhost103:8020
dfs.namenode.http-address.mycluster.nn1
localhost102:50070
dfs.namenode.http-address.mycluster.nn2
localhost103:50070
dfs.namenode.shared.edits.dir
qjournal://localhost102:8485;localhost103:8485;localhost104:8485/mycluster
dfs.client.failover.proxy.provider.mycluster
org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider
dfs.ha.fencing.methods
sshfence
dfs.ha.fencing.ssh.private-key-files
/home/shun/.ssh/id_rsa
dfs.permissions.enable
false
启动所有的JournalNode:sbin/hadoop-daemons.sh start journalnodes
在nn1上格式化并启动:bin/hdfs namenode -format,启动sbin/hadoop-daemon.sh start namenode
在nn2上同步nn1的信息并启动:bin/hdfs namenode -bootstrapStandby,启动:sbin/hadoop-daemon.sh start namenode
将nn1或nn2切换成Active状态:启动所有DataNode:sbin/hadoop-daemons.sh start datanode,切换为Active:bin/hdfs haadmin -transitionToActive nn1,查看状态:bin/hdfs haadmin -getServiceState nn1
配置HDFS HA自动故障转移
关闭所有HDFS服务:sbin/stop-dfs.sh
启动ZooKeeper集群:ZooKeeper目录下:bin/zkServer.sh start
配置core-site.xml,ZK地址
ha.zookeeper.quorum
localhost102:2181,localhost103:2181,localhost104:2181
配置hdfs-site.xml,开启自动故障转移
dfs.ha.automatic-failover.enabled
true
初始化HA在ZK中的状态:bin/hdfs zkfc -formatZK
启动HDFS服务:sbin/start-dfs.sh
注意:第一次使用集群时,必须先不打开自动故障转移;启动所有的JournalNode,格式化其中一个NameNode,然后启动,再在另一个NameNode上同步前一个NameNode的信息,开启这个NameNode。然后关闭所有HDFS服务,配置ZK地址、开启自动故障转移,再格式化zkfc,开启所有HDFS服务即可。
nn1和nn2的端口可以是1版本的8020,也可以是9000
YARN HA配置
配置yarn-site.xml,启用HA,声明集群名,两个rm的命名,声明两个rm的地址,ZK地址
yarn.nodemanager.aux-services
mapreduce_shuffle
yarn.log-aggregation-enable
true
yarn.log-aggregation.retain-seconds
604800
yarn.nodemanager.aux-services
mapreduce_shuffle
yarn.resourcemanager.ha.enabled
true
yarn.resourcemanager.cluster-id
cluster-yarn1
yarn.resourcemanager.ha.rm-ids
rm1,rm2
yarn.resourcemanager.hostname.rm1
localhost102
yarn.resourcemanager.hostname.rm2
localhost103
yarn.resourcemanager.zk-address
localhost102:2181,localhost103:2181,localhost104:2181
在rm1上开启所有YARN服务:sbin/start-yarn.sh(不会开启rm2的resourcemanager)
在rm2上开启resourcemanager:sbin/yarn-daemon.sh start resourcemanager
注意:
sbin/start-yarn.sh只开启本地的resourcemanager和所有的nodemanager,需要在两一个节点开启resourcemanager;
sbin/start-hdfs.sh开启所有节点的DataNode、NameNode、JournalNode、zkfc;
开启/关闭所有节点的单个HDFS进程:sbin/hadoop-daemons.sh start/stop namenode/datanode/journalnode/zkfc
开启/关闭所有节点的单个YARN进程:sbin/yarn-daemons.sh start/stop resourcemanager/nodemanager
单节点启动:sbin/hadoop-daemon.sh,sbin/yarn-daemon.sh