一、介绍:

  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故障转移机制图解:

    

集群架构存储 集群ha_服务器

  5、YARN-HA工作机制图解:

    

集群架构存储 集群ha_hadoop_02

 

二、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  

      

集群架构存储 集群ha_zookeeper_03

集群架构存储 集群ha_zookeeper_04

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>

core-site.xml

(5)配置hdfs-site.xml

      

集群架构存储 集群ha_zookeeper_03

集群架构存储 集群ha_zookeeper_04

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>

hdfs-site.xml

(6)分发到其他服务器
4、配置YARN-HA集群
  (1)配置yarn-site.xml

集群架构存储 集群ha_zookeeper_03

集群架构存储 集群ha_zookeeper_04

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>

yarn-site.xml

(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