HadoopHA(高可用集群)2.7.2 原理及搭建

一、介绍:

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工作要点:

3.1. 双nameNode来消除单点故障
3.2. 元数据管理方式需要改变

  • 内存中各自保存一份元数据;
  • Edits日志只有Active状态的NameNode节点可以做写操作;两个NameNode都可以读取Edits;
  • 共享的Edits放在一个共享存储中管理(qjournal和NFS两个主流实现);

3.3.需要一个状态管理功能模块

  • 实现了一个zkfailover,常驻在每一个namenode所在的节点,每一个zkfailover负责监控自己所在NameNode节点,

  • 利用zooKeeper进行状态标识,当需要进行状态切换时,由zkfailover来负责切换,切换时需要防止brain
    splitnaolie脑裂现象的发生。

3.4.必须保证两个NameNode之间能够ssh无密码登录

3.5.隔离(Fence),即同一时刻仅仅有一个NameNode对外提供服务

4.HDFS-HA故障转移机制图解:
在这里插入图片描述

5、YARN-HA工作机制图解:
在这里插入图片描述

二、HA集群配置

1、在完全分布式集群的基础下

2、配置zooKeeper集群

(1)将zooKeeper压缩包上传到到 /opt/software/目录下

(2)解压Zookeeper安装包到/opt/module/目录下

[jh@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

[jh@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目录

[jh@Hadoop03 zookeeper-3.4.14]$ mkdir zkData

(6)在/opt/module/zookeeper-3.4.10/zkData目录下创建一个myid的文件

 [jh@Hadoop03 zkData]$ touch myid

(7)编辑myid文件,在里面添加服务器ID,比如添加1

(8)分发配置好的zookeeper到其他机器上,并修改分发过去的服务器的myid文件,修改服务器ID

(9)分别启动zookeeper

[jh@Hadoop03 zookeeper-3.4.14]$ bin/zkServer.sh start

(10)查看状态

[jh@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)查看服务状态

bin/yarn rmadmin -getServiceState rm1

bin/hdfs haadmin -getServiceState nn1

猜你喜欢

转载自blog.csdn.net/weixin_46122692/article/details/109121056