Linux下Hadoop分布式文件系统分布模式+配置部署启动YARN+zookeeper

续我的上篇博文:https://mp.csdn.net/postedit/89183492即Hadoop分布式文件系统布模式+配置部署启动YARN已经部署好。

 

本篇博文在上篇博文的基础上配置部署zookeeper

 

一、实验环境(rhel7.3版本)

1、系统环境:

  1. selinux和firewalld状态为disabled
  2. Hadoop 、jdk、zookeeper 程序使用 nfs 共享同步配置文件

2、软件版本:

  1. hadoop-3.0.3.tar.gz
  2. zookeeper-3.4.9.tar.gz
  3. jdk-8u181-linux-x64.tar.gz

3各主机信息如下:

主机ip
server1(NameNode、 Secondary Namenode、nfs网络文件系统的服务端、ResourceManager、DFSZKFailoverController)172.25.83.1
server5(NameNode、 Secondary Namenode、nfs网络文件系统的客户端、ResourceManager、DFSZKFailoverController)172.25.83.5
server2(Datanode、nfs网络文件系统的客户端、NodeManager、JournalNode、QuorumPeerMain)172.25.83.2
server3(Datanode、nfs网络文件系统的客户端、NodeManager、JournalNode、QuorumPeerMain)172.25.83.3
server4(Datanode、nfs网络文件系统的客户端、NodeManager、JournalNode、QuorumPeerMain)172.25.83.4

在典型的 HA 集群中,通常有两台不同的机器充当 NN。在任何时间,只有一台机器处于Active 状态;另一台机器是处于 Standby 状态。Active NN 负责集群中所有客户端的操作;而 Standby NN 主要用于备用,它主要维持足够的状态,如果必要,可以提供快速的故障恢复。

为了让 Standby NN 的状态和 Active NN 保持同步,即元数据保持一致,它们都将会和JournalNodes 守护进程通信。当 Active NN 执行任何有关命名空间的修改,它需要持久化到一半以上的 JournalNodes 上(通过 edits log 持久化存储),而 Standby NN 负责观察 edits log 的变化,它能够读取从 JNs 中读取 edits 信息,并更新其内部的命名空间。一旦 Active NN
出现故障,Standby NN 将会保证从 JNs 中读出了全部的 Edits,然后切换成 Active 状态。Standby NN 读取全部的 edits 可确保发生故障转移之前,是和 Active NN 拥有完全同步的命名空间状态。

为了提供快速的故障恢复,Standby NN 也需要保存集群中各个文件块的存储位置。为了实现这个,集群中所有的 Database 将配置好 Active NN 和 Standby NN 的位置,并向它们发送块文件所在的位置及心跳,如下图所示:

在任何时候,集群中只有一个 NN 处于 Active 状态是极其重要的。否则,在两个 Active NN的状态下 NameSpace 状态将会出现分歧,这将会导致数据的丢失及其它不正确的结果。为了保证这种情况不会发生,在任何时间,JNs 只允许一个 NN 充当 writer。在故障恢复期间,将要变成 Active 状态的 NN 将取得 writer 的角色,并阻止另外一个 NN 继续处于 Active状态。

为了部署 HA 集群,你需要准备以下事项:
(1)、NameNode machines:运行 Active NN 和 Standby NN 的机器需要相同的硬件配置;
(2)、JournalNode machines:也就是运行 JN 的机器。JN 守护进程相对来说比较轻量,所以这些守护进程可以可其他守护线程(比如 NN,YARN ResourceManager)运行在同一台机器上。在一个集群中,最少要运行 3 个 JN 守护进程,这将使得系统有一定的容错能力。

当然,你也可以运行 3 个以上的 JN,但是为了增加系统的容错能力,你应该运行奇数个 JN(3、5、7 等),当运行 N 个 JN,系统将最多容忍(N-1)/2 个 JN 崩溃。在 HA 集群中,Standby NN 也执行 namespace 状态的 checkpoints,所以不必要运行
Secondary NN、CheckpointNode 和 BackupNode;事实上,运行这些守护进程是错误的。

 

 

4删除上一实验部署生成的数据并停止dfs和yarn

[hadoop@server1 hadoop]$ pwd
/home/hadoop/hadoop
[hadoop@server1 hadoop]$ sbin/stop-dfs.sh 
Stopping namenodes on [server1]
Stopping datanodes
Stopping secondary namenodes [server1]
[hadoop@server1 hadoop]$ sbin/stop-yarn.sh 
Stopping nodemanagers
Stopping resourcemanager
[hadoop@server1 hadoop]$ jps
7860 Jps

[hadoop@server2 ~]$ jps
2649 Jps

[hadoop@server3 ~]$ jps
2646 Jps

[hadoop@server4 ~]$ jps
3383 Jps


[hadoop@server1 hadoop]$ rm -rf /tmp/*
[hadoop@server1 hadoop]$ ls /tmp/
[hadoop@server1 hadoop]$ 

[hadoop@server2 hadoop]$ rm -rf /tmp/*
[hadoop@server2 hadoop]$ ls /tmp/
[hadoop@server2 hadoop]$ 

[hadoop@server3 hadoop]$ rm -rf /tmp/*
[hadoop@server3 hadoop]$ ls /tmp/
[hadoop@server3 hadoop]$ 

[hadoop@server4 hadoop]$ rm -rf /tmp/*
[hadoop@server4 hadoop]$ ls /tmp/
[hadoop@server4 hadoop]$ 

 

二、Hadoop分布模式+配置部署启动YARN+zookeeper

 

1、首先在上篇博文配置好的 nfs网络文件系统添加server5作为nfs网络文件系统的客户

端:

 

<1>在server5端:添加hadoop用户(指定的hadoop用户的uid为1004(与server1端hadoop用户保持一

致)),以生成需要挂载的目录/home/hadoop

#添加用户的操作,必须是root用户来执行,否则会报错
[root@server5 ~]# useradd -u 1004 hadoop
[root@server5 ~]# id hadoop
uid=1004(hadoop) gid=1004(hadoop) groups=1004(hadoop)

 

<2>在server5端:安装nfs-utils软件,以提供rpcbind服务,并启动rpcbind服务

#安装nfs-utils软件,启动rpcbind服务必须是root用户来操作,否则会报错
[root@server5 ~]# yum install nfs-utils -y
[root@server5 ~]# systemctl start rpcbind   #rpcbind这个服务在安装完nfs-utils软件之后,会自动启动,所以这步可做也可不做。但是重启系统之后,这步必须做(因为重启系统之后,rpcbind服务就会关闭)

 

<3>在server5端(nfs网络文件系统的客户端):查看服务端IP共享的文件或目录,进行挂载,并进入共享目录

查看内容

查看服务端IP共享的文件或目录,进行挂载,必须由root用户来操作,否则会报错
[root@server5 ~]# showmount -e 172.25.83.1
Export list for 172.25.83.1:
/home/hadoop *
[root@server5 ~]# mount 172.25.83.1:/home/hadoop /home/hadoop
[root@server5 ~]# df
172.25.83.1:/home/hadoop  17811456 6731008  11080448  38% /home/hadoop

进入共享目录查看共享内容,可以由hadoop用户操作,因为挂载点是hadoop用户的家目录/home/hadoop目录
[root@server5 ~]# su - hadoop
[hadoop@server5 ~]$ ll
total 488256
lrwxrwxrwx  1 hadoop hadoop        12 Apr  4 11:50 hadoop -> hadoop-3.0.3
drwxr-xr-x 10 hadoop hadoop       188 Apr 10 12:06 hadoop-3.0.3
-rw-r--r--  1 root   root   314322972 Apr  4 11:47 hadoop-3.0.3.tar.gz
lrwxrwxrwx  1 hadoop hadoop        13 Apr  4 11:50 java -> jdk1.8.0_181/
drwxr-xr-x  7 hadoop hadoop       245 Jul  7  2018 jdk1.8.0_181
-rw-r--r--  1 root   root   185646832 Apr  4 11:47 jdk-8u181-linux-x64.tar.gz

 

2、安装配置Zookeeper(Zookeeper 集群至少三台,总节点数为奇数个。)

 

配置server1(Namenode):当然也可以在server2端/server3端/server4端/server5端进行配置,因为配置了nfs网络文件系统,所以在任何一端进行操作均可以。

 

<1>安装jdk:(前面配置hadoop时,已经装过,这里不需要再装)

 

<2>安装zookeeper:(这里选用的版本为zookeeper-3.4.9)

 

(1)下载zookeeper对应的压缩包:zookeeper-3.4.9.tar.gz,到hadoop用户的家目录下,并进行解压

[hadoop@server1 ~]$ ll zookeeper-3.4.9.tar.gz 
-rw-r--r-- 1 root root 22724574 Apr 10 17:34 zookeeper-3.4.9.tar.gz
[hadoop@server1 ~]$ tar zxf zookeeper-3.4.9.tar.gz 

 

<3>对zookeeper进行配置,并启动zookeeper

 

(1)拷贝zoo_sample.cfg,重命名为zoo.cfg,并修改zoo.cfg文件

[hadoop@server1 ~]$ cd zookeeper-3.4.9/conf/
[hadoop@server1 conf]$ ls
configuration.xsl  log4j.properties  zoo_sample.cfg
[hadoop@server1 conf]$ cp zoo_sample.cfg zoo.cfg   #该配置文件的名字必须是zoo.cfg
[hadoop@server1 conf]$ vim zoo.cfg   #在文件的最后添加如下的内容
 30 server.1=172.25.83.2:2888:3888
 31 server.2=172.25.83.3:2888:3888
 32 server.3=172.25.83.4:2888:3888

 

 

(2)在server2,server3,server4端:设置myid:

各节点配置文件相同,并且需要在/tmp/zookeeper 目录中创建 myid 文件,写入一个唯一的数字,取值范围在 1-255。比如:172.25.83.2 节点的 myid 文件写入数字“1”,此数字与配置文件中的定义保持一致,(server.1=172.25.83.2:2888:3888
)其它节点依次类推。

 

[hadoop@server2 ~]$ mkdir /tmp/zookeeper
[hadoop@server2 ~]$ echo 1 > /tmp/zookeeper/myid
[hadoop@server2 ~]$ cat /tmp/zookeeper/myid 
1


[hadoop@server3 ~]$ mkdir /tmp/zookeeper
[hadoop@server3 ~]$ echo 2 > /tmp/zookeeper/myid
[hadoop@server3 ~]$ cat /tmp/zookeeper/myid
2


[hadoop@server4 ~]$ mkdir /tmp/zookeeper
[hadoop@server4 ~]$ echo 3 > /tmp/zookeeper/myid
[hadoop@server4 ~]$ cat /tmp/zookeeper/myid
3

 

(3)在server2,server3,server4端:启动zookeeper:因为这里没有配置环境变量,所以需要执行"bin/zkServer.sh start"来启动zookeeper,启动后,可以执行"bin/zkServer status"来查看zookeeper的状态。

三台机器的zookeeper状态必须只有一个leader,其他都是follower。

[hadoop@server2 zookeeper-3.4.9]$ bin/zkServer.sh start
ZooKeeper JMX enabled by default
Using config: /home/hadoop/zookeeper-3.4.9/bin/../conf/zoo.cfg
Starting zookeeper ... STARTED

[hadoop@server3 zookeeper-3.4.9]$ bin/zkServer.sh start
ZooKeeper JMX enabled by default
Using config: /home/hadoop/zookeeper-3.4.9/bin/../conf/zoo.cfg
Starting zookeeper ... STARTED

[hadoop@server4 zookeeper-3.4.9]$ bin/zkServer.sh start
ZooKeeper JMX enabled by default
Using config: /home/hadoop/zookeeper-3.4.9/bin/../conf/zoo.cfg
Starting zookeeper ... STARTED



[hadoop@server2 zookeeper-3.4.9]$ bin/zkServer.sh status
ZooKeeper JMX enabled by default
Using config: /home/hadoop/zookeeper-3.4.9/bin/../conf/zoo.cfg
Mode: follower   #server2端的状态是follower

[hadoop@server3 zookeeper-3.4.9]$ bin/zkServer.sh status
ZooKeeper JMX enabled by default
Using config: /home/hadoop/zookeeper-3.4.9/bin/../conf/zoo.cfg
Mode: leader   #server3端的状态是leader

[hadoop@server4 zookeeper-3.4.9]$ bin/zkServer.sh status
ZooKeeper JMX enabled by default
Using config: /home/hadoop/zookeeper-3.4.9/bin/../conf/zoo.cfg
Mode: follower   #server4端的状态是follower



#这里值的注意的是:至少启动两个节点才能查看状态。如果启动一个节点就查看状态,会报下面的错
[hadoop@server2 zookeeper-3.4.9]$ bin/zkServer.sh status
ZooKeeper JMX enabled by default
Using config: /home/hadoop/zookeeper-3.4.9/bin/../conf/zoo.cfg
Error contacting service. It is probably not running.

 

在哪个目录下启动,就在那个目录下产生一个启动的日志zookeeper.out,查看这个日志可以查看是否正常启动了。(这里只演示server2端的,server3端和server4端同理。)

 

启动zookeeper之后,会打开2181端口(这里只演示server2端的,server3端和server4端同理。)

 

<4>在server2,server3和server4端:利用jps命令查看java进程:若有QuorumpeerMain,则启动成功

[hadoop@server2 ~]$ jps
2832 QuorumPeerMain   #新增加的内容
3263 Jps


[hadoop@server3 ~]$ jps
2775 QuorumPeerMain   #新增加的内容
2971 Jps


[hadoop@server4 ~]$ jps
6547 Jps
4360 QuorumPeerMain   #新增加的内容

 

至此zookeeper的安装配置也就完成了。

在server2端(当然也可以是server3端,server4端。其实只要是zookeeper集群的集群节点都可以):为了进一步了解zookeeper,我们可以利用zookeeper客户端的命令,连接客户端,查看一些信息

[hadoop@server2 zookeeper-3.4.9]$ pwd
/home/hadoop/zookeeper-3.4.9
[hadoop@server2 zookeeper-3.4.9]$ bin/zkCli.sh 
[zk: localhost:2181(CONNECTED) 0] ls /   #获取/下的节点信息
[zookeeper]
[zk: localhost:2181(CONNECTED) 1] ls /zookeeper   #获取/zookeeper下的节点信息
[quota] 
[zk: localhost:2181(CONNECTED) 2] ls /zookeeper/quota   #获取/zookeeper/quota下的节点信息
[]
[zk: localhost:2181(CONNECTED) 3] get /zookeeper/quota   #获取/zookeeper/quota下的节点的状态信息

cZxid = 0x0
ctime = Thu Jan 01 08:00:00 CST 1970
mZxid = 0x0
mtime = Thu Jan 01 08:00:00 CST 1970
pZxid = 0x0
cversion = 0
dataVersion = 0
aclVersion = 0
ephemeralOwner = 0x0
dataLength = 0
numChildren = 0
[zk: localhost:2181(CONNECTED) 4] quit   #退出

 

3、配置hadoop

 

配置server1(Namenode):当然也可以在server2端/server3端/server4端/server5端进行配置,因为配置了nfs网络文件系统,所以在任何一端进行操作均可以。

 

<1>设置ssh免密登陆(前提:安装ssh服务)—实际上因为server2端,server3端,server4端和server5端的/home/hadoop目录中的内容是通过 server1端共享出来的,因此,实际上已经实现了server1,server2,server3,server4和server5之间的免密,而server1—>server1间的免密是上篇博文部署伪分布模式时配置好的。

  • 验证普通用户hadoop:server1,server2,server3,server4和server5之间的免密

 

<2>编辑 core-site.xml 文件:

[hadoop@server1 hadoop]$ pwd
/home/hadoop/hadoop/etc/hadoop
[hadoop@server1 hadoop]$ vim core-site.xml   #在文件的最后添加如下的内容(删除之前实验时在该文件最后写入的内容)
 19 <configuration>
 20     <property>   #该property对:指定hdfs的namenode为masters(名称可自定义)
 21         <name>fs.defaultFS</name>
 22         <value>hdfs://masters</value>   #将原来的172.25.83.1:9000该为masters
 23     </property>
 24 
 25     <property>   #该property对:指定zookeeper集群主机地址   
 26         <name>ha.zookeeper.quorum</name>
 27         <value>172.25.83.2:2181,172.25.83.3:2181,172.25.83.4:2181</value>
 28     </property>
 29 </configuration>

 

<3>编辑 hdfs-site.xml 文件:

[hadoop@server1 hadoop]$ pwd
/home/hadoop/hadoop/etc/hadoop
[hadoop@server1 hadoop]$ vim hdfs-site.xml   #在文件的最后添加如下的内容(删除之前实验时在该文件最后写入的内容)
 19 <configuration>
 20     <property>
 21         <name>dfs.replication</name>
 22         <value>3</value>   #将之前的2该为3,因为这里有3个Datanode节点,所以这里将副本数设置为3
 23     </property>
 24 
 25     <property>   #该property对:指定hdfs的nameservices为masters,和core-site.xml文件中的设置保持一致
 26         <name>dfs.nameservices</name>
 27         <value>masters</value>
 28     </property>
 29 
 30     <property>   #该property对:masters下面有两个namenode节点,分别是h1和h2(名称可自定义,只要保证下面的h1,h2的名字和这里一致即可)
 31         <name>dfs.ha.namenodes.masters</name>
 32         <value>h1,h2</value>
 33     </property>
 34 
 35     <property>   #该property对:指定h1节点的rpc通信地址
 36         <name>dfs.namenode.rpc-address.masters.h1</name>
 37         <value>172.25.83.1:9000</value>
 38     </property>
 39 
 40     <property>   #该property对:指定h1节点的http通信地址
 41         <name>dfs.namenode.http-address.masters.h1</name>
 42         <value>172.25.83.1:9870</value>
 43     </property>
 44 
 45     <property>   #该property对:指定h2节点的rpc通信地址
 46         <name>dfs.namenode.rpc-address.masters.h2</name>
 47         <value>172.25.83.5:9000</value>
 48     </property>
 49 
 50     <property>   #该property对:指定h2节点的http通信地址
 51         <name>dfs.namenode.http-address.masters.h2</name>
 52         <value>172.25.83.5:9870</value>
 53     </property>
 54 
 55     <property>   #该property对:指定NameNode元数据在JournalNode上的存放位置
 56         <name>dfs.namenode.shared.edits.dir</name>
 57         <value>qjournal://172.25.83.2:8485;172.25.83.3:8485;172.25.83.4:8485/masters</value>
 58     </property>
 59 
 60     <property>   #该property对:指定JournalNode在本地磁盘存放数据的位置
 61         <name>dfs.journalnode.edits.dir</name>
 62         <value>/tmp/journaldata</value>
 63     </property>
 64 
 65     <property>   #该property对:开启NameNode失败自动切换
 66         <name>dfs.ha.automatic-failover.enabled</name>
 67         <value>true</value>
 68     </property>
 69 
 70     <property>   #该property对:配置失败自动切换实现方式
 71         <name>dfs.client.failover.proxy.provider.masters</name>
 72         <value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value>
 73     </property>
 74 
 75     <property>   #该property对:配置隔离机制方法,每个机制占用一行  
 76         <name>dfs.ha.fencing.methods</name>
 77         <value>
 78             sshfence
 79             shell(/bin/true)
 80         </value>
 81     </property>
 82 
 83     <property>   #该property对:使用sshfence隔离机制时需要ssh免密码
 84         <name>dfs.ha.fencing.ssh.private-key-files</name>
 85         <value>/home/hadoop/.ssh/id_rsa</value>
 86     </property>
 87 
 88     <property>   #该property对:配置sshfence隔离机制超时时间
 89         <name>dfs.ha.fencing.ssh.connect-timeout</name>
 90         <value>30000</value>
 91     </property>
 92 
 93 </configuration>

 

4、启动 hdfs 集群(按顺序启动)

 

<1>在三个 DN 上依次启动 zookeeper 集群:bin/zkServer.sh start。在安装部署zookeeper时已经做过,这里不需要再做

 

<2>在三个 DN 上依次启动 journalnode(第一次启动 hdfs 必须先启动 journalnode)

[hadoop@server2 hadoop]$ sbin/hadoop-daemon.sh start journalnode
WARNING: Use of this script to start HDFS daemons is deprecated.
WARNING: Attempting to execute replacement "hdfs --daemon start" instead.
#根据提示,我们应该使用bin/hdfs --daemon start journalnode。不过这只是警告,事实上Datanode节点已经启动成功,我们利用下面的jps命令就可以看到
[hadoop@server2 hadoop]$ jps
2832 QuorumPeerMain
3804 Jps
3773 JournalNode   #新增加的内容


[hadoop@server3 hadoop]$ pwd
/home/hadoop/hadoop
[hadoop@server3 hadoop]$ bin/hdfs --daemon start journalnode
[hadoop@server3 hadoop]$ jps
2775 QuorumPeerMain
3195 JournalNode   #新增加的内容
3214 Jps


[hadoop@server4 hadoop]$ pwd
/home/hadoop/hadoop
[hadoop@server4 hadoop]$ bin/hdfs --daemon start journalnode
[hadoop@server4 hadoop]$ jps
4360 QuorumPeerMain
8492 JournalNode   #新增加的内容
8510 Jps

 

<3>格式化 HDFS 集群(只需在 h1 上执行即可)

[hadoop@server1 hadoop]$ pwd
/home/hadoop/hadoop
[hadoop@server1 hadoop]$ bin/hdfs namenode -format

[hadoop@server1 hadoop]$ ls /tmp   #格式化之后在/tmp目录下生成相应的文件
hadoop-hadoop  hadoop-hadoop-namenode.pid  hsperfdata_hadoop  

 

我们查看server5端上/tmp目录下有没有格式化集群产生的文件:

[hadoop@server5 ~]$ ls /tmp/
[hadoop@server5 ~]$ 

 

我们发现server5端的/tmp目录下没有内容,因此我们需要将数据(hadoop-hadoop目录)拷贝到server5端(h2节点)的/tmp目录下

[hadoop@server1 ~]$ scp -r /tmp/hadoop-hadoop server5:/tmp
VERSION                                          100%  215     0.2KB/s   00:00    
seen_txid                                        100%    2     0.0KB/s   00:00    
fsimage_0000000000000000000.md5                  100%   62     0.1KB/s   00:00    
fsimage_0000000000000000000                      100%  391     0.4KB/s   00:00 


[hadoop@server5 ~]$ ll /tmp/
total 0
drwxrwxr-x 3 hadoop hadoop 17 Apr 10 21:46 hadoop-hadoop

 

<4>格式化 zookeeper (只需在 h1 上执行即可)

[hadoop@server1 hadoop]$ pwd 
/home/hadoop/hadoop
[hadoop@server1 hadoop]$ bin/hdfs zkfc -formatZK   #注意大小写

 

在server2端(当然也可以是server3端,server4端。其实只要是zookeeper集群的集群节点都可以):格式化zookeeper之后,我们利用zookeeper客户端的命令,连接客户端,查看格式化zookeeper生成的一些信息,以确保zookeeper格式化成功

[hadoop@server2 zookeeper-3.4.9]$ pwd
/home/hadoop/zookeeper-3.4.9
[hadoop@server2 zookeeper-3.4.9]$ bin/zkCli.sh
[zk: localhost:2181(CONNECTED) 0] ls /
[zookeeper, hadoop-ha]   #我们看到hadoop-ha表示zookeeper格式化成功
[zk: localhost:2181(CONNECTED) 1] ls /hadoop-ha/masters
[]
[zk: localhost:2181(CONNECTED) 2] get /hadoop-ha/masters

cZxid = 0x200000017
ctime = Wed Apr 10 21:48:00 CST 2019
mZxid = 0x200000017
mtime = Wed Apr 10 21:48:00 CST 2019
pZxid = 0x200000017
cversion = 0
dataVersion = 0
aclVersion = 0
ephemeralOwner = 0x0
dataLength = 0
numChildren = 0

 

<5>启动 hdfs 集群(只需在 h1 上执行即可):所有节点对应的内容都会启动

[hadoop@server1 hadoop]$ sbin/start-dfs.sh
Starting namenodes on [server1 server5]
Starting datanodes
Starting journal nodes [172.25.83.2 172.25.83.3 172.25.83.4]
172.25.83.2: journalnode is running as process 4973.  Stop it first.
172.25.83.4: journalnode is running as process 10248.  Stop it first.
172.25.83.3: journalnode is running as process 4250.  Stop it first.
Starting ZK Failover Controllers on NN hosts [server1 server5]

 

<6>查看各节点状态

[hadoop@server1 hadoop]$ jps
8037 Jps
7945 DFSZKFailoverController   #新增加的
7551 NameNode   #新增加的


[hadoop@server5 ~]$ jps
12768 Jps
12738 DFSZKFailoverController   #新增加的
12623 NameNode   #新增加的


[hadoop@server2 ~]$ jps
5142 DataNode   #新增加的
4888 QuorumPeerMain
5259 Jps
4973 JournalNode   

[hadoop@server3 ~]$ jps
5142 DataNode   #新增加的
4888 QuorumPeerMain
5259 Jps
4973 JournalNode   


[hadoop@server4 ~]$ jps
5142 DataNode   #新增加的
4888 QuorumPeerMain
5259 Jps
4973 JournalNode   

 

 

 

在server2端(当然也可以是server3端,server4端。其实只要是zookeeper集群的集群节点都可以):我们利用zookeeper客户端的命令,连接客户端,查看格式化zookeeper生成的一些信息,以确保服务配置成功,并且可以查看上面浏览器中看到的信息(server1处于active状态,server5处于standby状态)。

 

[hadoop@server2 zookeeper-3.4.9]$ pwd
/home/hadoop/zookeeper-3.4.9
[hadoop@server2 zookeeper-3.4.9]$ bin/zkCli.sh
[zk: localhost:2181(CONNECTED) 0] ls /
[zookeeper, hadoop-ha]
[zk: localhost:2181(CONNECTED) 1] ls /hadoop-ha/masters/Active

ActiveBreadCrumb           ActiveStandbyElectorLock
[zk: localhost:2181(CONNECTED) 1] ls /hadoop-ha/masters/ActiveBreadCrumb
[]
[zk: localhost:2181(CONNECTED) 2] get /hadoop-ha/masters/ActiveBreadCrumb   #看到ActiveBreadCrumb和ActiveStandbyElectorLock文件,并qie可以看到ActiveBreadCrumb对应的信息,表示服务配置成功

mastersh1server1 �F(�>   #表明处于active状态的server1
cZxid = 0x10000000c
ctime = Wed Apr 10 22:30:48 CST 2019
mZxid = 0x10000000c
mtime = Wed Apr 10 22:30:48 CST 2019
pZxid = 0x10000000c
cversion = 0
dataVersion = 0
aclVersion = 0
ephemeralOwner = 0x0
dataLength = 28
numChildren = 0

 

<7>测试hdfs故障自动切换

[hadoop@server1 ~]$ jps
7945 DFSZKFailoverController
12426 Jps
7551 NameNode
[hadoop@server1 ~]$ kill -9 7551   #杀掉Namenode对应的进程ID
[hadoop@server1 ~]$ jps
12450 Jps
7945 DFSZKFailoverController


[hadoop@server1 hadoop]$ pwd
/home/hadoop/hadoop
[hadoop@server1 hadoop]$ bin/hdfs dfs -mkdir -p /user/hadoop   
[hadoop@server1 hadoop]$ bin/hdfs dfs -mkdir input   
[hadoop@server1 hadoop]$ bin/hdfs dfs -put etc/hadoop/*.xml input

 

杀掉 h1 主机的 namenode 进程后依然可以访问,此时 h2 转为 active 状态接管 namenode

 

 

 

 

 

 

[hadoop@server1 hadoop]$ pwd
/home/hadoop/hadoop
[hadoop@server1 hadoop]$ bin/hdfs --daemon start namenode
[hadoop@server1 hadoop]$ jps
13575 NameNode
13640 Jps
7945 DFSZKFailoverController

启动 h1 上的 namenode后,此时为 standby 状态(server1端看不到创建的目录/user/hadoop,也看不到上传的input目录)。

 

 

 

到此 hdfs 的高可用完成,接下来看看 yarn 的高可用:

 

配置server1(Namenode):当然也可以在server2端/server3端/server4端/server5端进行配置,因为配置了nfs网络文件系统,所以在任何一端进行操作均可以。

 

<1>编辑 mapred-site.xml 文件

[hadoop@server1 hadoop]$ pwd
/home/hadoop/hadoop/etc/hadoop
[hadoop@server1 hadoop]$ vim mapred-site.xml   #在文件的最后添加如下的内容(删除之前实验时在该文件最后写入的内容)
 19 <configuration>
 20     <property>   #该property对:指定yarn为MapReduce的框架
 21         <name>mapreduce.framework.name</name>
 22         <value>yarn</value>
 23     </property>
 24 </configuration>

 

<2>编辑 yarn-site.xml 文件

[hadoop@server1 hadoop]$ pwd 
/home/hadoop/hadoop/etc/hadoop
[hadoop@server1 hadoop]$ vim yarn-site.xml   #在文件的最后添加如下的内容(删除之前实验时在该文件最后写入的内容)
 15 <configuration>
 16     <property>   #该property对:配置可以在 nodemanager 上运行 mapreduce 程序
 17         <name>yarn.nodemanager.aux-services</name>
 18         <value>mapreduce_shuffle</value>
 19     </property>
 20 
 21     <property>   #该property对:激活RM高可用
 22         <name>yarn.resourcemanager.ha.enabled</name>
 23         <value>true</value>
 24     </property>
 25 
 26     <property>   #该property对:指定RM的集群id
 27         <name>yarn.resourcemanager.cluster-id</name>
 28         <value>RM_CLUSTER</value>
 29     </property>
 30 
 31     <property>   #该property对:定义RM的节点,分别为恶哦rm1,rm2(名称可自定义,只要保证下面的rm1,rm2的名字和这里一致即可)
 32         <name>yarn.resourcemanager.ha.rm-ids</name>
 33         <value>rm1,rm2</value>
 34     </property>
 35 
 36     <property>   #该property对:指定RM1的地址
 37         <name>yarn.resourcemanager.hostname.rm1</name>
 38         <value>172.25.83.1</value>
 39     </property>
 40 
 41     <property>   #该property对:指定RM2的地址
 42         <name>yarn.resourcemanager.hostname.rm2</name>
 43         <value>172.25.83.5</value>
 44     </property>
 45 
 46     <property>   #该property对:激活RM自动恢复
 47         <name>yarn.resourcemanager.recovery.enabled</name>
 48         <value>true</value>
 49     </property>
 50 
 51     <property>   #该property对:配置RM状态信息存储方式,有MemStore和ZKStore
 52         <name>yarn.resourcemanager.store.class</name>
 53         <value>org.apache.hadoop.yarn.server.resourcemanager.recovery.ZKRMStateStore</value>
 54     </property>
 55 
 56     <property>   #该property对:配置为zookeeper存储时,指定zookeeper集群的地址
 57         <name>yarn.resourcemanager.zk-address</name>
 58         <value>172.25.83.2:2181,172.25.83.3:2181,172.25.83.4:2181</value>
 59     </property>
 60 
 61 </configuration>

 

<3>启动 yarn 服务(只需在 h1 上执行即可):所有节点对应的内容都会启动

[hadoop@server1 hadoop]$ pwd 
/home/hadoop/hadoop
[hadoop@server1 hadoop]$ sbin/start-yarn.sh 
Starting resourcemanagers on [ 172.25.83.1 172.25.83.5]
Starting nodemanagers

 

<4>查看各节点状态

[hadoop@server1 ~]$ jps
13575 NameNode
7945 DFSZKFailoverController
20009 ResourceManager   #新增加的
20202 Jps

[hadoop@server2 ~]$ jps
5989 Jps
5142 DataNode
4888 QuorumPeerMain
5864 NodeManager   #新增加的
4973 JournalNode

[hadoop@server3 hadoop]$ jps
5136 Jps
5011 NodeManager   #新增加的
4358 DataNode
4169 QuorumPeerMain
4250 JournalNode

[hadoop@server4 ~]$ jps
12978 Jps
10248 JournalNode
10409 DataNode
10156 QuorumPeerMain
12831 NodeManager   #新增加的

 

在server2端(当然也可以是server3端,server4端。其实只要是zookeeper集群的集群节点都可以):我们利用zookeeper客户端的命令,连接客户端,查看格式化zookeeper生成的一些信息,以确保服务配置成功,并且可以查看ResourceManager对应的master的信息(此时:server5是resourcemanager的master)。

 

[hadoop@server2 zookeeper-3.4.9]$ pwd
/home/hadoop/zookeeper-3.4.9
[hadoop@server2 zookeeper-3.4.9]$ bin/zkCli.sh
[zk: localhost:2181(CONNECTED) 0] ls /
[zookeeper, yarn-leader-election, hadoop-ha, rmstore]
[zk: localhost:2181(CONNECTED) 1] ls /yarn-leader-election/RM_CLUSTER/Active

ActiveBreadCrumb           ActiveStandbyElectorLock
[zk: localhost:2181(CONNECTED) 1] ls /yarn-leader-election/RM_CLUSTER/ActiveBreadCrumb
[]
[zk: localhost:2181(CONNECTED) 2] get /yarn-leader-election/RM_CLUSTER/ActiveBreadCrumb


RM_CLUSTERrm2   #表明server5为resourcemanager的master
cZxid = 0x100000051
ctime = Thu Apr 11 00:10:29 CST 2019
mZxid = 0x100000051
mtime = Thu Apr 11 00:10:29 CST 2019
pZxid = 0x100000051
cversion = 0
dataVersion = 0
aclVersion = 0
ephemeralOwner = 0x0
dataLength = 17
numChildren = 0

 

<5>测试 yarn 故障切换

[hadoop@server5 ~]$ jps
12738 DFSZKFailoverController
14150 Jps
13883 ResourceManager
12623 NameNode
[hadoop@server5 ~]$ kill -9 13883   #杀掉ResourceManager对应的进程ID
[hadoop@server5 ~]$ jps
12738 DFSZKFailoverController
14162 Jps
12623 NameNode

 

[hadoop@server2 zookeeper-3.4.9]$ pwd
/home/hadoop/zookeeper-3.4.9
[hadoop@server2 zookeeper-3.4.9]$ bin/zkCli.sh
[zk: localhost:2181(CONNECTED) 0] ls /
[zookeeper, yarn-leader-election, hadoop-ha, rmstore]
[zk: localhost:2181(CONNECTED) 1] ls /yarn-leader-election/RM_CLUSTER/Active

ActiveBreadCrumb           ActiveStandbyElectorLock
[zk: localhost:2181(CONNECTED) 1] ls /yarn-leader-election/RM_CLUSTER/ActiveBreadCrumb
[]
[zk: localhost:2181(CONNECTED) 2] get /yarn-leader-election/RM_CLUSTER/ActiveBreadCrumb


RM_CLUSTERrm1   #表明server1接管resourcemanager
cZxid = 0x100000051
ctime = Thu Apr 11 00:10:29 CST 2019
mZxid = 0x100000063
mtime = Thu Apr 11 00:21:22 CST 2019
pZxid = 0x100000051
cversion = 0
dataVersion = 1
aclVersion = 0
ephemeralOwner = 0x0
dataLength = 17
numChildren = 0

 

启动 rm2上的 resourcemanager后,rm1(server1)仍为resourcemanager的master。

[hadoop@server5 hadoop]$ pwd
/home/hadoop/hadoop
[hadoop@server5 hadoop]$ bin/yarn --daemon start resourcemanager
[hadoop@server5 hadoop]$ jps
14272 Jps
12738 DFSZKFailoverController
14244 ResourceManager
12623 NameNode

 


但是值的一提的是:server1处于active状态还是server5处于active状态,是根据Namenode决定的,不是根据Resourcemanager决定的。所以在测试yarn的高可用时,在web界面看不到效果。


 

到此 yarn 的高可用完成,接下来看看 yarn 的主备切换原理:

 

主备切换原理:下面我们就来看看 YARN 是如何实现多个 ResourceManager 之间的主备切换的。

创建锁节点在 ZooKeeper 上会有一个/yarn-leader-election/appcluster-yarn 的锁节点,所有的 ResourceManager 在启动的时 候,都会去竞争写一个Lock子点:/yarn-leader-election/appcluster-yarn/ActiveBreadCrumb,该节点是临时节点。ZooKeeper 能够为我们保证最终只有一个 ResourceManager 能够创建成功。创建成功的那个 ResourceManager 就切换为 Active 状态,没有成功的那些 ResourceManager 则切换为 Standby状态。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值