一、介绍:
1、所谓HA(High Available),即高可用(7*24小时不中断服务)
2、实现高可用的关键是消除单点故障,即HDFS的nameNode和YARN的resourceManager,所以HA机制就是HDFS的HA和YARN的HA。
由于一个HDFS集群由一个NameNode节点和多个DataNode节点组成,一旦NameNode节点宕机,那么HDFS将不能进行文件的上传与下载。
由于一个Yarn集群由一个ResourceManager节点和多个NodeManager节点组成,一旦ResourceManager节点宕机,那么YARN集群将不能进行资源的调度。
3、HDFS-HA工作要点:
(1)、双nameNode来消除单点故障
(2)、元数据管理方式需要改变
内存中各自保存一份元数据;
Edits日志只有Active状态的NameNode节点可以做写操作;两个NameNode都可以读取Edits;
共享的Edits放在一个共享存储中管理(qjournal和NFS两个主流实现);
(3)、需要一个状态管理功能模块
实现了一个zkfailover,常驻在每一个namenode所在的节点,每一个zkfailover负责监控自己所在NameNode节点,
利用zooKeeper进行状态标识,当需要进行状态切换时,由zkfailover来负责切换,切换时需要防止brain splitnaolie脑裂现象的发生。
(4)、必须保证两个NameNode之间能够ssh无密码登录
(5)、隔离(Fence),即同一时刻仅仅有一个NameNode对外提供服务
4、HDFS-HA故障转移机制图解:
5、YARN-HA工作机制图解:
二、HA集群配置
1、在完全分布式集群的基础下
2、配置zooKeeper集群
(1)将zooKeeper压缩包放到 /opt/software/目录下
(2)解压Zookeeper安装包到/opt/module/目录下
[jinghang@Hadoop03 software]$ tar -zxvf zookeeper-3.4.10.tar.gz -C /opt/module/
(3)重命名/opt/module/zookeeper-3.4.10/conf这个目录下的zoo_sample.cfg为zoo.cfg
[jinghang@Hadoop03 conf]$ mv zoo_sample.cfg zoo.cfg
(4)配置zoo.cfg文件
修改存储节点数据
dataDir=/opt/module/zookeeper-3.4.10/zkData
增加zooKeeper集群配置
#######################cluster##########################
server.1=Hadoop03:2888:3888
server.2=Hadoop04:2888:3888
server.3=Hadoop05:2888:3888
(5)在/opt/module/zookeeper-3.4.10/这个目录下创建zkData目录
[jinghang@Hadoop03 zookeeper-3.4.14]$ mkdir zkData
(6)在/opt/module/zookeeper-3.4.10/zkData目录下创建一个myid的文件
[jinghang@Hadoop03 zkData]$ touch myid
(7)编辑myid文件,在里面添加服务器ID,比如添加1
(8)分发配置好的zookeeper到其他机器上,并修改分发过去的服务器的myid文件,修改服务器ID
(9)分别启动zookeeper
[jinghang@Hadoop03 zookeeper-3.4.14]$ bin/zkServer.sh start
[jinghang@Hadoop03 zookeeper-3.4.14]$ bin/zkServer.sh start
[jinghang@Hadoop03 zookeeper-3.4.14]$ bin/zkServer.sh start
(10)查看状态
[jinghang@Hadoop03 zookeeper-3.4.14]$ bin/zkServer.sh status
3、配置HDFS-HA集群
(1)在/opt/module/目录下创建一个ha文件夹
(2)将/opt/module/下的 hadoop-2.7.2拷贝到/opt/module/ha目录下
(3)配置hadoop-env.sh
export JAVA_HOME=/opt/module/jdk1.8.0_144
(4)配置core-site.xml
1 <configuration> 2 <!-- 把两个NameNode)的地址组装成一个集群mycluster --> 3 <property> 4 <name>fs.defaultFS</name> 5 <value>hdfs://mycluster</value> 6 </property> 7 8 <!-- 指定hadoop运行时产生文件的存储目录 --> 9 <property> 10 <name>hadoop.tmp.dir</name> 11 <value>/opt/ha/hadoop-2.7.2/data/tmp</value> 12 </property> 13 <property> 14 <name>ha.zookeeper.quorum</name> 15 <value>hadoop102:2181,hadoop103:2181,hadoop104:2181</value> 16 </property> 17 </configuration>
(5)配置hdfs-site.xml
1 <configuration> 2 <!-- 完全分布式集群名称 --> 3 <property> 4 <name>dfs.nameservices</name> 5 <value>mycluster</value> 6 </property> 7 8 <!-- 集群中NameNode节点都有哪些 --> 9 <property> 10 <name>dfs.ha.namenodes.mycluster</name> 11 <value>nn1,nn2</value> 12 </property> 13 14 <!-- nn1的RPC通信地址 --> 15 <property> 16 <name>dfs.namenode.rpc-address.mycluster.nn1</name> 17 <value>hadoop102:9000</value> 18 </property> 19 20 <!-- nn2的RPC通信地址 --> 21 <property> 22 <name>dfs.namenode.rpc-address.mycluster.nn2</name> 23 <value>hadoop103:9000</value> 24 </property> 25 26 <!-- nn1的http通信地址 --> 27 <property> 28 <name>dfs.namenode.http-address.mycluster.nn1</name> 29 <value>hadoop102:50070</value> 30 </property> 31 32 <!-- nn2的http通信地址 --> 33 <property> 34 <name>dfs.namenode.http-address.mycluster.nn2</name> 35 <value>hadoop103:50070</value> 36 </property> 37 38 <!-- 指定NameNode元数据在JournalNode上的存放位置 --> 39 <property> 40 <name>dfs.namenode.shared.edits.dir</name> 41 <value>qjournal://hadoop102:8485;hadoop103:8485;hadoop104:8485/mycluster</value> 42 </property> 43 44 <!-- 配置隔离机制,即同一时刻只能有一台服务器对外响应 --> 45 <property> 46 <name>dfs.ha.fencing.methods</name> 47 <value>sshfence</value> 48 </property> 49 50 <!-- 使用隔离机制时需要ssh无秘钥登录--> 51 <property> 52 <name>dfs.ha.fencing.ssh.private-key-files</name> 53 <value>/home/jinghang/.ssh/id_rsa</value> 54 </property> 55 56 <!-- 声明journalnode服务器存储目录--> 57 <property> 58 <name>dfs.journalnode.edits.dir</name> 59 <value>/opt/ha/hadoop-2.7.2/data/jn</value> 60 </property> 61 62 <!-- 关闭权限检查--> 63 <property> 64 <name>dfs.permissions.enable</name> 65 <value>false</value> 66 </property> 67 68 <!-- 访问代理类:client,mycluster,active配置失败自动切换实现方式--> 69 <property> 70 <name>dfs.client.failover.proxy.provider.mycluster</name> 71 <value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value> 72 </property> 73 <property> 74 <name>dfs.ha.automatic-failover.enabled</name> 75 <value>true</value> 76 </property> 77 </configuration>
(6)分发到其他服务器
4、配置YARN-HA集群
(1)配置yarn-site.xml
1 <configuration> 2 3 <property> 4 <name>yarn.nodemanager.aux-services</name> 5 <value>mapreduce_shuffle</value> 6 </property> 7 8 <!--启用resourcemanager ha--> 9 <property> 10 <name>yarn.resourcemanager.ha.enabled</name> 11 <value>true</value> 12 </property> 13 14 <!--声明两台resourcemanager的地址--> 15 <property> 16 <name>yarn.resourcemanager.cluster-id</name> 17 <value>cluster-yarn1</value> 18 </property> 19 20 <property> 21 <name>yarn.resourcemanager.ha.rm-ids</name> 22 <value>rm1,rm2</value> 23 </property> 24 25 <property> 26 <name>yarn.resourcemanager.hostname.rm1</name> 27 <value>hadoop102</value> 28 </property> 29 30 <property> 31 <name>yarn.resourcemanager.hostname.rm2</name> 32 <value>hadoop103</value> 33 </property> 34 35 <!--指定zookeeper集群的地址--> 36 <property> 37 <name>yarn.resourcemanager.zk-address</name> 38 <value>hadoop102:2181,hadoop103:2181,hadoop104:2181</value> 39 </property> 40 41 <!--启用自动恢复--> 42 <property> 43 <name>yarn.resourcemanager.recovery.enabled</name> 44 <value>true</value> 45 </property> 46 47 <!--指定resourcemanager的状态信息存储在zookeeper集群--> 48 <property> 49 <name>yarn.resourcemanager.store.class</name> <value>org.apache.hadoop.yarn.server.resourcemanager.recovery.ZKRMStateStore</value> 50 </property> 51 </configuration>
(2)分发到其他服务器
5、启动
(1)在各个JournalNode节点上,输入以下命令启动journalnode服务:
sbin/hadoop-daemon.sh start journalnode
(2)在[nn1]上,对其进行格式化,并启动:
bin/hdfs namenode -format
sbin/hadoop-daemon.sh start namenode
(3)在[nn2]上,同步nn1的元数据信息:
bin/hdfs namenode -bootstrapStandby
(4)启动[nn2]:
sbin/hadoop-daemon.sh start namenode
(5)启动所有DataNode
sbin/hadoop-daemons.sh start datanode
(6)再启动各台服务器中的Zookeeper集群:
bin/zkServer.sh start
(7)在任意服务器初始化HA在Zookeeper中状态:
bin/hdfs zkfc -formatZK
(8)在namenode所在的节点启动HDFS服务:
sbin/start-dfs.sh
(9)在resourcemanager所在的服务器执行:
sbin/start-yarn.sh
(10)确保两个resourcemanager都启动了,如果没有启动手动开启:
sbin/yarn-daemon.sh start resourcemanager
(11)查看服务状态,如图3-24所示
bin/yarn rmadmin -getServiceState rm1
bin/hdfs haadmin -getServiceState nn1