HDFS-NameNode(NN) HA 实现方式
Hadoop 从2.0版本通过基于zookeeper实现了高可用 (High Availability, HA)。QJM(Qurom Journal Manager)是当前主流HDFS NameNode HA方案。故本讲也是使用QJM实现HA
QJM 的基本原理:
Active NameNode(ANN)
1 | 在HDFS集群中,对外提供读写服务的唯一Master节点。ANN将客户端请求过来的写操作通过EditLog写入共享存储系统(即JournalNode Cluster),为Standby NameNode及时同步数据提供支持; |
Standby NameNode(SBN)
1 | 与ANN相互形成热备,SBN及时从共享存储系统中读取EditLog数据并更新内存,以保证当前状态尽可能与ANN同步。当前在整个HDFS集群中最多一台处于Active状态,最多一台处于Standby状态; |
JournalNode Cluster(JNs)
1 | ANN与SBN之间共享Editlog的一致性存储系统,是HDFS NameNode高可用的核心组件。借助JournalNode集群ANN可以尽可能及时同步元数据到SBN。其中ANN采用Push模式将EditLog写入JN,SBN通过Pull模式从JN拉取数据,整个过程中JN不主动进行数据交换; |
ZKFiloverController(ZKFC)
1 | ZKFailoverController以独立进程运行,对NameNode主备切换进行控制,正常情况ANN和SBN分别对应各自ZKFC进程。ZKFC主要功能:NameNode健康状况检测;借助Zookeeper实现NameNode自动选主;操作NameNode进行主从切换; |
Zookeeper(ZK)
1 | 为ZKFC实现自动选主功能提供统一协调服务。 |
YARN-ResourceManager(RM) HA实现方式
ResourceManager(RM) HA 实现方式: RM 将状态信息存储在 Zookeeper 中,当 Active 故障,Standby 切换为 Active 后, 从 ZK 读取相应的作业信息,重新构建作业的内存信息,然后开始接受 NodeManager 心 跳,并接受客户端提交作业的请求等。
规划
- 安装包版本以及功能
软件名 | 版本号 | 功能 |
---|---|---|
Hadoop | hadoop-2.7.3.tar.gz | 为海量数据提供分布式存 储(HDFS)和分布式计算 (YARN)。 |
ZooKeeper | zookeeper-3.4.10.tar.gz | 一个分布式应用程序协调 服务,为应用提供一致性服 务 |
JDK | jdk-8u201-linux-x64.tar.gz | JAVA 运行环境 |
- 集群架构规划
IP | 角色 | ZooKeeper | HostName |
---|---|---|---|
10.0.10.100 | NameNode/ResourceManeger/nodemanager | / | ActiveNN |
10.0.10.101 | NameNode/ResourceManeger/nodemanager | QuorumPeerMain | StandbyNN |
10.0.10.111 | DataNode/JournalNode/nodemanager | QuorumPeerMain | slave1 |
10.0.10.112 | DataNode/JournalNode/nodemanager | QuorumPeerMain | slave2 |
10.0.10.113 | DataNode/JournalNode/nodemanager | / | slave3 |
基础环境准备[所有节点配置]
- 修改主机名
1 | # hostnamectl set-hostname [hostname] |
- 修改Hosts
1 | # cat /etc/hosts |
- 关闭防火墙
1 | systemctl stop firewalld |
- 关闭SELINUX
1 | #临时 |
- 配置NTP时间同步
1 | 这里采用chrony。架构如下: |
参考:Chrony部署
- 配置SSH免密登陆
1 | 作用是后边Namenode HA隔离配置以及个别服务启动需要使用 |
所有节点都要重复此过程
1 | 生成密钥对 |
- 设置透明大页面
1 | Transparent Hugepage如果开启,可能会严重降低Hadoop集群性能,CentOS7默认启用 |
查看当前是否启用
1 | # cat /sys/kernel/mm/transparent_hugepage/enabled |
禁用Transparent Hugepage(重启生效)
1 | # vim /etc/rc.d/rc.local |
- 调整swap内核参数
1 | 该值用于控制从物理内存到磁盘上的虚拟内存的应用数据的交换。值越高,内存交换越积极。值越低,交换的次数越少。大多数系统默认为60,但不适用于Hadoop集群,因为即使有足够的内存,Hadoop进程也有可能会被交换到磁盘,影响集群稳定性和性能。 |
查看当前参数
1 | # cat /proc/sys/vm/swappiness |
设置vm.swappiness值为1
1 | #临时生效 |
- 安装JDK
1 | tar -zxf jdk-8u201-linux-x64.tar.gz -C /opt |
Zookeeper集群部署[在3台zk节点部署]
1 | tar -zxf zookeeper-3.4.10.tar.gz -C /opt |
1 | cat /etc/profile |
配置zookeeper集群
1 | mkdir -p /opt/zookeeper/data |
编辑配置文件zoo.cfg
1 | dataDir=/opt/zookeeper/data |
分别创建ServerID标识
1 | [root@slave1 ~]# echo "1" > /opt/zookeeper/data/myid |
分别启动zookeeper
1 | [root@slave1 ~]# /opt/zookeeper/bin/zkServer.sh start |
1 | 自启动zookeeper |
查看zookeeper集群状态
1 | [root@slave1 ~]# /opt/zookeeper/bin/zkServer.sh status |
测试zookeeper集群
1 | [root@slave1 data]# jps -m |
1 | [root@slave1 ~]# /opt/zookeeper/bin/zkCli.sh -server 10.0.10.113:2181 |
Hadoop HA集群部署[每台节点同样的安装与配置]
安装与配置
1 | tar -zxf hadoop-2.7.3.tar.gz -C /opt |
修改hadoop命令环境变量/etc/profile
1 | #Hadoop |
修改配置文件
1 | cd /opt/hadoop/etc/hadoop |
hadoop-env.sh
1 | 将“export JAVA_HOME=${JAVA_HOME}” 修改为自己的JDK安装路径 |
core-site.xml
1 | <configuration> |
修改hdfs-site.xml
说明:每个节点均新挂了块100GB磁盘用于HDFS数据存储,挂载目录为/data/A
1 | <configuration> |
mapred-site.xml
复制mapred-site.xml.template为mapred-site.xml
1 | <configuration> |
1 | 注: |
yarn-site.xml
1 | <configuration> |
将以上配置文件上传到3台slave
1 | 将hadoop-env.sh、core-site.xml、hdfs-site.xml、mapred-site.xml和yarn-site.xml 这修改好的文件,上传到3台Slave节点 |
Hadoop集群初始化
格式化ZKFC(在ActiveNN上执行)
1 | 首先需要启动zookeeper集群 |
1 | [root@activenn ~]# cd /opt/hadoop/ |
格式化成功信息
1 | 19/03/15 18:56:11 INFO ha.ActiveStandbyElector: Session connected. |
格式化HDFS
启动journalnode(分别在Slave1、Slave2和Slave3上执行)
1 | hadoop-daemon.sh start journalnode |
启动验证
1 | [root@slave1 hadoop]# jps -m |
格式化HDFS(在ActiveNN上执行)
1 | hdfs namenode -format |
1 | 出现如下信息说明HDFS格式化成功 |
将格式化之后的ActiveNN节点hadoop工作目录中的元数据目录复制到StandbyNN节点
1 | scp -r /data/A/namenode/current StandbyNN:/data/A/namenode |
初始化完毕之后可以把3个slave节点的journalnode服务关闭(分别在Slave1、Slave2、Slave3上执行)
1 | [root@slave3 hadoop]# hadoop-daemon.sh stop journalnode |
启动Hadoop所涉及的服务(在ActiveNN上执行)
1 | [root@activenn ~]# start-all.sh |
启动各节点的jobhistoryserver
1 | 注: |
Jobhistory serverWeb UI
1 | http://主机名:19888 |
启动各节点Yarn nodemanager服务
hadoop start-all.sh命令除了自己的nodemanager服务之外,不会启动其他节点的nodemanager服务,故其他节点的nodemanager服务需要手动启动
1 | [root@slave1 hadoop]# start-yarn.sh |
HDFS HA Web 验证
1 | http://ActiveNN:50070 |
1 | http://StandbyNN:50070 |
HDFS HA功能验证
1 | 测试是否为HA,可以先 kill 这个 active NN,然后另外一个 standby NN就会变成 active NN。 |
Kill掉NameNode进程
1 | [root@ActiveNN ~]# kill 10205 //kill掉NameNode进程 |
1 | [root@standbynn ~]# jps -m |
此时,Standbynn节点进程已经死掉了,下面通过访问ActiveNN节点,查看是否变为Active
YARN-ResourceManager HA验证
注意:在ActiveNN节点使用命令:start-all.sh或start-yarn.sh 启动YARN时,不会启动StandbyNN节点的YARN进程
手动启动StandbyNN节点YARN
1 | [root@standbynn hadoop]# yarn-daemon.sh start resourcemanager |
1 | [root@standbynn hadoop]# jps -m |
YARN管理命令
1 | YARN管理命令用到的是yarn rmadmin ,作用:可以查看RM的健康状态、转换Active/Standby状态等。 |
查看RM状态来验证HA
1 | [root@activenn hadoop]# yarn rmadmin -getServiceState rm1 |
Web方式访问RM来查看作业信息
1 | 主:http://10.0.10.100:8088 |
模拟10.0.10.100的RM进程挂掉,看看会不会故障自动转移
1 | root@activenn hadoop]# stop-yarn.sh |
1 | [root@activenn hadoop]# yarn rmadmin -getServiceState rm1 |
- 本文作者: GaryWu
- 本文链接: https://garywu520.github.io/2018/12/19/Hadoop HA 2.7.3完全分布式集群部署-终极版/
- 版权声明: 本博客所有文章除特别声明外,均采用 MIT 许可协议。转载请注明出处!