Hadoop HA及联邦机制配置指南
一 Hadoop HA机制存在原因
1.1 HA:High Available,高可用
在Hadoop 2.0之前,在HDFS 集群中NameNode 存在单点故障 (SPOF:A Single Point of Failure)。 对于只有一个 NameNode 的集群,如果 NameNode 机器出现故障(比如宕机或是软件、硬件 升级),那么整个集群将无法使用,直到 NameNode 重新启动
1.2 如何解决:
HDFS 的 HA 功能通过配置 Active/Standby 两个 NameNodes 实现在集群中对 NameNode 的热备来解决上述问题。如果出现故障,如机器崩溃或机器需要升级维护,这时可通过此种方式将 NameNode 很快的切换到另外一台机器。 在一个典型的 HDFS(HA) 集群中,使用两台单独的机器配置为 NameNodes 。在任何时间点,确保 NameNodes 中只有一个处于 Active 状态,其他的处在 Standby 状态。其中 ActiveNameNode 负责集群中的所有客户端操作,StandbyNameNode 仅仅充当备机,保证一 旦 ActiveNameNode 出现问题能够快速切换。
为了能够实时同步 Active 和 Standby 两个 NameNode 的元数据信息(实际上 editlog),需提 供一个共享存储系统,可以是 NFS、QJM(Quorum Journal Manager)或者 Zookeeper,Active Namenode 将数据写入共享存储系统,而 Standby 监听该系统,一旦发现有新数据写入,则 读取这些数据,并加载到自己内存中,以保证自己内存状态与 Active NameNode 保持基本一 致,如此这般,在紧急情况下 standby 便可快速切为 active namenode。为了实现快速切换, Standby 节点获取集群的最新文件块信息也是很有必要的。为了实现这一目标,DataNode 需要配置 NameNodes 的位置,并同时给他们发送文件块信息以及心跳检测。
1.3 集群规划样例:
**Journalnode:**hadoop框架为集群专门写了分布式应用qjournal(依赖zookeeper实现),作用是为了解决HA机制同步问题。它会将NN的active节点新写入的元数据放到zookeeper集群上,standby节点在active节点正常情况下只需将zk上的edits文件同步到自己的fsimage中。
**Zkfc:**监控进程(依赖zookeeper实现)。时刻监控namenode的状态。对于处在active状态的namenode,如果发现不正常就向zookeeper集群中写入一些数据。对于处在standby状态的namenode,监控进程从zookeeper集群中读数据,从而感知到active节点是否正常。如果发现异常,监控进程负责将standby状态切换到active状态。
二 HAhadoop安装配置
2.1 以3台机器配置 hadoop HA 为例
hadoop 版本:hadoop-2.7.6.tar.gz
zookeeper 版本:zookeeper-3.4.10.tar.gz
2.2 提前工作
- 配置好3台虚拟机 hosts
# vi /etc/hosts
127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4
::1 localhost localhost.localdomain localhost6 localhost6.localdomain6
192.168.8.128 hd01
192.168.8.129 hd02
192.168.8.130 hd03
- 关闭防火墙(root用户下)
systemctl status firewalld(查看防火墙状态)
Active: inactive (dead)(防火墙已关闭)
systemctl stop firewalld(关闭防火墙)
systemctl disable firewalld(开机不自启动
- 配置所有节点的ssh免密码登录设置
ssh-keygen -t rsa
然后发送给每一台,也要发送自己
ssh-copy-id hd01
ssh-copy-id hd02
ssh-copy-id hd03
2.3 Hadoop集群模式环境部署 HA
一、服务节点的部署规划
HA 有两种状态:
- 故障,需要手动切换
- 故障,自动故障转移
二、ZooKeeper 配置–分布式模式
- 把 zookeeper-3.4.10.tar.gz 解压到一个目录中
# tar -zxvf zookeeper-3.4.10.tar.gz -C /opt/
- 修改conf/zoo_sample.cfg 重命名 zoo.cfg文件
- 指定ZK本地存储的数据存放目录
dataDir=/opt/zookeeper-3.4.10/zkData
- 指定所有ZK的节点以及端口号(内部相互通信端口号:选举端口号)
server.1=hd01:2888:3888
server.2=hd02:2888:3888
server.3=hd03:2888:3888
ps:
2181表示客户端端口号
2888表示ZK节点内部通信端口号
3888表示ZK内部选举端口号
5. 在dataDir=/opt/zookeeper-3.4.10/zkData/路径下创建文件
创建名为myid的文件,注意一定要这个文件名
写对应的编号,比如:1
6. 将配置分发到其他节点上
scp -r zookeeper-3.4.10/ hd02:/opt/
scp -r zookeeper-3.4.10/ hd03:/opt/
7. 分发完成之后需要更改其他节点上的myid对应编号
里面的值就是第一台机器写1,第二台写2,第三台写3,就可以了,要跟你的server.1这里的1
8. 启动所有ZK的节点
zkServer.sh start
9. 查看状态
bin/zkServer.sh status
当看到 2个: follower 和 1个: leader 说明配置成功
三、配置 Hadoop 集群
- 在hadoop-env.sh和mapred-env.sh还有yarn-env.sh中写上你的jdk路径(有可能这条属性被注释掉了,记得解开,把前面的#去掉就可以了)
export JAVA_HOME=/opt/jdk1.8.0_181 - 配置 /opt/hadoop-2.7.6/etc/hadoop 下的5个文件
core-site.xml
hdfs-site.xml
mapred-site.xml(重命名:mapred-site.xml.template)
yarn-site.xml
slaves
1)、core-site.xml
<configuration>
<property>
<name>fs.defaultFS</name>
<value>hdfs://ns1</value>
</property>
<property>
<name>hadoop.tmp.dir</name>
<value>/opt/hadoop-2.7.6/tmp</value>
</property>
<!-- Resource Manager UI的默认用户dr.who权限不正确 ,这里写上你的机器用户名-->
<property>
<name>hadoop.http.staticuser.user</name>
<value>root</value>
</property>
<property>
<name>ha.zookeeper.quorum</name>
<value>hd01:2181,hd02:2181,hd03:2181</value>
</property>
</configuration>
2)、hdfs-site.xml
<configuration>
<property>
<name>dfs.replication</name>