Hadoop 分布式集群实战 2—— Hadoop 高可用架构
1 HDFS‑HA 核心组件
- 2 台 NameNode
Active NameNode:对外处理客户端读写,唯一写元数据Standby NameNode:热备,不接收客户端请求,实时同步元数据,故障时升级为 Active
- JournalNode 集群(JN,奇数,3 台起步)
共享存储,保存edits编辑日志。Active 把修改写入 JN 集群;Standby 持续读取 JN 的 edits,在内存回放,保持元数据同步腾讯云。
Quorum 机制:写入超过半数 JN 成功,才算写成功,容忍半数以下节点故障。
- ZooKeeper 集群(奇数)
负责选主、故障检测,保存分布式锁,防止脑裂(同一时刻只允许一个 Active)。 - ZKFC(ZKFailoverController)
每个 NameNode 节点上都要跑一个 ZKFC 进程,三个职责:
①健康检测:监控本机 NameNode 是否存活;
②和 ZK 交互:抢锁竞选 Active;
③故障隔离 (fence):旧 Active 故障卡死,SSH 远程杀死旧 NN 进程,防止脑裂。 - DataNode
同时向两台 NameNode 汇报块信息,不管谁是 Active 都上报。

| IP | 主机名 | 角色 |
|---|---|---|
| 192.168.40.141 | server1 | NameNode / DFSZKFailoverController / ResourceManager |
| 192.168.40.142 | server2 | JournalNode / QuorumPeerMain / DataNode / NodeManager |
| 192.168.40.143 | server3 | JournalNode / QuorumPeerMain / DataNode / NodeManager |
| 192.168.40.144 | server4 | JournalNode / QuorumPeerMain / DataNode / NodeManager |
| 192.168.40.145 | server5 | NameNode / DFSZKFailoverController / ResourceManager |
2 部署
2.1 虚拟机准备
新开虚拟机server5
[root@server5 ~]# useradd hadoop
# 还是要保证 uid 和 gid 与其他节点相同
[root@server5 ~]# yum install -y nfs-utils
[root@server5 ~]# mount 192.168.40.141:/home/hadoop/ /home/hadoop/
2.2 ZooKeeper 集群部署
上传安装包并解压
[hadoop@server1 hadoop]$ sbin/stop-all.sh
[hadoop@server1 hadoop]$ cd
[hadoop@server1 ~]$ tar zxf apache-zookeeper-3.8.6-bin.tar.gz
集群配置
[hadoop@server2 ~]$ cd apache-zookeeper-3.8.6-bin/conf/
[hadoop@server2 conf]$ cp zoo_sample.cfg zoo.cfg
[hadoop@server2 conf]$ vim zoo.cfg
各节点配置文件相同,此处的server.1并不是指 server1,下一步需要在/tmp/zookeeper目录中创建 myid 文件,写入一个唯一的数字,取值范围在1-255。编号1/2/3对应每台节点 myid 文件里面的数字,数字和机器一一对应

三台机器分别生成 myid,编号 1、2、3,和zoo.cfg里面server.1 server.2 server.3一一对应,并且要删除/tmp下的文件,目的是清除旧残留数据,防止和 HA 模式自动生成的元数据、日志冲突
[hadoop@server2 conf]$ rm -rf /tmp/*
[hadoop@server2 conf]$ mkdir /tmp/zookeeper
[hadoop@server2 conf]$ echo 1 > /tmp/zookeeper/myid
[hadoop@server3 ~]$ rm -rf /tmp/*
[hadoop@server3 ~]$ mkdir /tmp/zookeeper
[hadoop@server3 ~]$ echo 2 > /tmp/zookeeper/myid
[hadoop@server4 ~]$ rm -rf /tmp/*
[hadoop@server4 ~]$ mkdir /tmp/zookeeper
[hadoop@server4 ~]$ echo 3 > /tmp/zookeeper/myid
在各节点启动服务
[hadoop@server2 conf]$ cd ..
[hadoop@server2 apache-zookeeper-3.8.6-bin]$ bin/zkServer.sh start
[hadoop@server2 apache-zookeeper-3.8.6-bin]$ bin/zkServer.sh status
server2 的角色是 follower

[hadoop@server3 ~]$ cd apache-zookeeper-3.8.6-bin/
[hadoop@server3 apache-zookeeper-3.8.6-bin]$ bin/zkServer.sh start
[hadoop@server3 apache-zookeeper-3.8.6-bin]$ bin/zkServer.sh status
server3 的角色是 leader

[hadoop@server4 ~]$ cd apache-zookeeper-3.8.6-bin/
[hadoop@server4 apache-zookeeper-3.8.6-bin]$ bin/zkServer.sh start
[hadoop@server4 apache-zookeeper-3.8.6-bin]$ bin/zkServer.sh status
server4 的角色是 follower

查看进程



2.3 Hadoop 配置
[hadoop@server1 ~]$ cd hadoop/etc/hadoop/
[hadoop@server1 hadoop]$ vim core-site.xml

[hadoop@server1 hadoop]$ vim hdfs-site.xml


在三个DN上依次启动 journalnode
[hadoop@server2 apache-zookeeper-3.8.6-bin]$ cd
[hadoop@server2 ~]$ cd hadoop
[hadoop@server2 hadoop]$ bin/hdfs --daemon start journalnode

[hadoop@server3 apache-zookeeper-3.8.6-bin]$ cd
[hadoop@server3 ~]$ cd hadoop
[hadoop@server3 hadoop]$ bin/hdfs --daemon start journalnode

[hadoop@server4 apache-zookeeper-3.8.6-bin]$ cd
[hadoop@server4 ~]$ cd hadoop
[hadoop@server4 hadoop]$ bin/hdfs --daemon start journalnode

格式化 HDFS 集群,只在 server1 上执行
[hadoop@server1 hadoop]$ cd
[hadoop@server1 ~]$ cd hadoop
[hadoop@server1 hadoop]$ bin/hdfs namenode -format
scp -r /tmp/hadoop-hadoop server5:/tmp

格式化 ZooKeeper,只在 server1 上执行
[hadoop@server1 hadoop]$ bin/hdfs zkfc -formatZK

启动 HDFS 集群,只在 server1 上执行
[hadoop@server1 hadoop]$ sbin/start-dfs.sh

查看各节点状态





查看前端网页,server1 为 active,server5 为standby


测试
中止 server1 的NameNode 进程
[hadoop@server1 hadoop]$ kill -9 40713
server1 的前端无法访问

server5 变 active

恢复 server1
[hadoop@server1 hadoop]$ bin/hdfs --daemon start namenode
server1 变 standby

2.4 yarn 高可用配置
[hadoop@server1 hadoop]$ pwd
/home/hadoop/hadoop
[hadoop@server1 hadoop]$ vim etc/hadoop/yarn-site.xml

启动 yarn 服务
[hadoop@server1 hadoop]$ sbin/start-yarn.sh



server1 为 standby

server5 为 active

测试
中止 server5 的 ResourceManager 进程
[hadoop@server5 hadoop]$ kill -9 28361
server1 变 active

恢复 server5 服务
[hadoop@server5 hadoop]$ bin/yarn --daemon start resourcemanager
server5 变 standby

更多推荐
所有评论(0)