文章目录
零、序
强烈建议看完 Cris 小哥哥的 Linux 学习笔记以及 ZooKeeper 和 Hadoop 的学习笔记再来看这篇笔记,否则你几乎不可能看懂~
1. Hadoop 实现 HA 原理
1.1 什么是 HA?
1)所谓HA(high available),即高可用(7*24小时不中断服务)。
2)实现高可用最关键的策略是消除单点故障(single point of failure,SPOF)。单点故障是一个组件发生故障,就会导致整个系统无法运行。HA严格来说应该分成各个组件的HA机制:HDFS的HA和YARN的HA。
3)Hadoop2.0之前,在HDFS集群中NameNode存在单点故障。
4)NameNode主要在以下两个方面影响HDFS集群
NameNode机器发生意外,如宕机,集群将无法使用,直到管理员重启
NameNode机器需要升级,包括软件、硬件升级,此时集群也将无法使用HDFS HA功能通过配置Active/Standby两个nameNodes实现在集群中对NameNode的热备来解决上述问题。如果出现故障,如机器崩溃或机器需要升级维护,这时可通过此种方式将NameNode很快的切换到另外一台机器
1.2 HA 工作机制
配置两个 namenode
,通过双 namenode
消除单点故障
2. HDFS-HA 手动故障转移(了解)
实际生产中,都是使用自动故障转移,这里给出手动故障转移的操作流程是希望大家知其所以然~
2.1 要点
1)元数据管理方式需要改变:
内存中各自保存一份元数据;
Edits
日志只有 Active
状态的 namenode
节点可以做写操作;
两个 namenode
都可以读取 edits
;
共享的 edits
放在一个共享存储中管理(qjournal
和 NFS
两个主流实现);
2)必须保证两个 NameNode
之间能够 ssh
无密码登录。
3)隔离(Fence),即同一时刻仅仅有一个 NameNode
对外提供服务,防止脑裂(split-brain)
2.2 环境准备
- 修改
IP
- 修改主机名及主机名和
IP
地址的映射 - 关闭防火墙
ssh
免密登录- 安装
JDK
,配置环境变量等
如果不会的同学请参考 Cris 小哥哥的 Hadoop 学习笔记
2.3 测试集群规划
hadoop101 | hadoop102 | hadoop103 | |
---|---|---|---|
HDFS | NameNode DataNode JournalNode | NameNode DataNode JournalNode | DataNode JournalNode |
YARN | NodeManager | ResourceManager NodeManager | NodeManager |
2.4 配置 HDFS-HA 集群
-
首先应该做好虚拟机的快照!!! 防止出现问题随时回滚 ?
-
在
/opt/module/
目录下创建一个HA
文件夹mkdir HA
然后将我们之前就装好的 Hadoop 的文件夹拷贝到 HA 目录里去
cp -r zookeeper-3.4.10/ HA/
-
确保配置
hadoop-env.sh
中的JAVA_HOME
变量为Linux
安装的jdk
目录 -
配置
core-site.xml
,具体配置参数如下<configuration> <!-- 把两个NameNode的地址组装成一个集群mycluster --> <property> <name>fs.defaultFS</name> <value>hdfs://mycluster</value> </property> <!-- 声明journalnode服务本地文件系统存储目录--> <property> <name>dfs.journalnode.edits.dir</name> <value>/opt/module/HA/hadoop-2.7.2/data/jn</value> </property> <!-- 指定hadoop运行时产生文件的存储目录 --> <property> <name>hadoop.tmp.dir</name> <value>/opt/module/HA/hadoop-2.7.2/data/tmp</value> </property> </configuration>
-
配置
hdfs-site.xml
<configuration> <!-- 完全分布式集群名称 --> <property> <name>dfs.nameservices</name> <value>mycluster</value> </property> <!-- 该nameservice下NameNode节点都有哪些 --> <property> <name>dfs.ha.namenodes.mycluster</name>