一、Hadoop HA 高可用集群整体架构
在 Hadoop 1.0 时代,Hadoop 中的HDFS 集群中面临一个问题,即NameNode 单点问题,如果在集群运行过程中,NameNode出现故障宕机后,那么整个集群将会面临瘫痪。
Hadoop 2.0 以后,NameNode 的单点问题得到了解决,共有两台NameNode并形成互备,一台处于活动状态,一台处于备用状态,只有活动状态的NameNode才会对外提供服务,而备用状态的NameNode不对外提供服务,仅同步Active NameNode的状态,以便能在它失败时快速进行切换
上图为Hadoop HA 的高可用整体架构图,它的主要主成部分如下
1.两台NameNode
Active NameNode 和 Standby NameNode:两台 NameNode形成互备,一台处于 Active(活动)状态,一台处理Standby(备用)状态,只有主NameNode才能对外提供读写服务
2.主备切换控制器:ZKFailoverController
ZKFailoverController作为独立的进程运行,对NameNode的主备切换进行总体控制,及时监控检测NameNode的健康状态,当主 NameNode发生故障后,借助Zookeeper实现自动的主备选举和切换。
3.Zookeeper集群
为主备切换控制器(ZKFailoverController)提供主备选举支持,当一个NameNode节点出现故障后,切换备用NameNode为主节点,从而实现Hadoop HA 高可用。
4.基于QJM的共享存储系统
QJM为Quorum Journal Manager的缩写,JournalNode中保存了NameNode在运行过程中所产生的HDFS的元数据,主NameNode和备NameNode通过共享存储系统实现元数据同步,在进行主备切换时,新的NameNode在确认元数据完全同步完成后才能继续对外提供服务。
5.DN
DataNode的缩写,用于存放数据文件的节点,hadoop2.x默认一个块的大小为128M,hadoop1.0为64M,默认备份数量为3,可以通过hadoop 的配置文件修改。
NameNode主备切换实现
Hadoop HA 中有两台NameNode,它们之间形成互备,那么我们来看下它是如何实现主备切换
NameNode 主备切换主要由ZKFailoverController、HealthMonitor和ActiveStandbyElector三个组件协同实现
1.ZKFailoverController
作为NameNode上一个独立的进程启动,启动后会创建HealthMonitor和ActiveStandbyElector,创建的同时会注册相应的回调方法。
2.HealthMonitor
主要负责检测NameNode的健康状态,如果检测到NameNode的状态发生变化,则回调ZKFailoverController的相应方法进行自动的主备选举
3.ActiveStandbyElector
主要负责完成自动的主备选举,内部封装了zookeeper的处理逻辑,一旦zookeeper主备选举完成,会回调ZKFailoverController的相应方法进行NameNode的主备状态切换
二、前期准备
编号 | 系统 | IP | 主机名称 |
node1 | centos7 | 192.168.18.27 | master27 |
node2 | centos7 | 192.168.18.28 | master28 |
node3 | centos7 | 192.168.18.29 | dn29 |
node4 | centos7 | 192.168.18.30 | dn30 |
node5 | centos7 | 192.168.18.31 | dn31 |
参考如上,创建5台虚拟机,使用最小安装,内存最小1G,创建完成后,分别配置主机名、静态IP、主机名与IP映射、创建 hadoop 用户并为 hadoop 用户授权,配置无密登录两个NN都要无密登录其他的机器上
在进行正式软件安装前我们需要把防火墙和selinux守护进程关闭也可以在集群配置文件完成后启动集群之前操作如下命令:
# systemctl status firewalld # 查看防火墙状态# systemctl stop firewalld # 关闭防火墙# systemctl disable firewalld # 禁止防火墙开机自启动
# getenforce # 查看守护进程状态# setenforce
0
# 临时关闭守护进程# vi /etc/selinux/config 设置SELINUX=disabled # 永久关闭守护进程
三、软件安装
在5台虚拟机中分别安装 jdk 及 hadoop
hadoop ha 配置(node1、2、3、4、5)
node1、node2、node3、node4、node5分别配置
core-site.xml:
<configuration>
<property>
<name>fs.defaultFS</name>
<value>hdfs://cluster</value>
</property>
<property>
<name>hadoop.tmp.dir</name>
<value>/home/hadoop/app/hadoop/tmp</value>
<description>指定hadoop临时目录</description>
</property>
<property>
<name>ha.zookeeper.quorum</name>
<value>dn29:2181,dn30:2181,dn31:2181</value>
<description>指定zookeeper地址</description>
</property>
<property>
<name>ha.zookeeper.session-timeout.ms</name>
<value>300000</value>
<description>zk的超时时间,单位为毫秒,默认为5000,这个值比较小。建
议设置得大一些,zk过于敏感,避免因为网路抖动等原因引起NameNode进行无所谓的>主备切换</description>
</property>
<property>
<name>fs.trash.interval</name>
<value>1440</value>
<description>开启垃圾回收站功能,防止误删除文件,HDFS文件删除后先放
入回收站,单位为分,垃圾回收站最长保留数据时间为1天,超过一天后删除</description>
</property>
<property>
<name>io.file.buffer.size</name>
<value>131072</value>
<description>设置SequenceFile中用到的读/写缓存大小,合理设置缓存大>小有利于提高数据传输效率,单位为byte,默认为4KB,这里设置为128KB</description>
</property>
</configuration>
hdfs-site.xml
<configuration>
<property>