hadoop 分布式文件系统的计算和高可用
Posted 123坤
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了hadoop 分布式文件系统的计算和高可用相关的知识,希望对你有一定的参考价值。
hadoop 分布式文件系统的计算和高可用
1. 分布式计算
- 编辑
mapreduce
的配置文件,并将配置文件中写入内容的变量写入 hadoop 的启动脚本中;
[hadoop@server5 hadoop]$ pwd
/home/hadoop/hadoop/etc/hadoop
[hadoop@server5 hadoop]$ vim mapred-site.xml
[hadoop@server5 hadoop]$ vim hadoop-env.sh
- 编辑管理器的配置文件并启动
[hadoop@server5 hadoop]$ vim yarn-site.xml
[hadoop@server5 hadoop]$ pwd
/home/hadoop/hadoop
[hadoop@server5 hadoop]$ sbin/start-yarn.sh
Starting resourcemanager
Starting nodemanagers
server8: Warning: Permanently added 'server8,172.25.25.8' (ECDSA) to the list of known hosts.
启动管理器,NameNode 会启动一个 ResourceManager
进程(资源管理器)
在其他 dn 上面会出现结点管理器
其原理是:当客户端提交一个 job 时,首先会去 RM 上申请运行一个应用,此时 RM 会根据客户端的请求到后端的 NM 上,NM 会将结点上的资源汇报给 RM ,RM 再将信息发送至客户端。
此时会在网页访问到 8088 端口:172.25.25.5:8088,如图所示:
2. NN 高可用
此处有 5 台主机,其中两个 master 各2G,其他三个各 1G。
- NN 名字节点(hdfs)的高可用
生产环境建议将 NN 和 RM 分离,NN本身就是一个资源管理器(占用很多的资源),RM负责资源调度,消耗的资源也很多。
如果二者在一起运行,有可能会发生争抢资源的情况
本实验将NN和RM合并
server6~8:最小化的集群,日志节点、zk节点、DN、NM管理器的NM节点合并在一起;
server5 和 server9 做高可用的 master和 backup:故障切换控制器、RM、NN;
(1)再加一台主机,写入解析,新建用户,安装软件;
[root@server9 ~]# vim /etc/hosts
[root@server9 ~]# useradd hadoop
[root@server9 ~]# yum install nfs-utils -y
[root@server9 ~]# mount 172.25.25.5:/home/hadoop/ /home/hadoop/
(2)在开始前先做清理动作
[hadoop@server5 hadoop]$ sbin/stop-yarn.sh ##停掉 yarn 管理器
Stopping nodemanagers
Stopping resourcemanager
[hadoop@server5 hadoop]$ jps
7248 SecondaryNameNode
8107 Jps
7052 NameNode
[hadoop@server6 ~]$ jps ##其他几个datanode 上也是一样
5554 Jps
5193 DataNode
-------
[hadoop@server5 hadoop]$ sbin/stop-dfs.sh ##停掉 dfs
Stopping namenodes on [server5]
Stopping datanodes
Stopping secondary namenodes [server5]
[hadoop@server5 hadoop]$ jps
8528 Jps
[hadoop@server7 ~]$ jps ##其他几个datanode 上也是一样
5480 Jps
前面的实验(完全分布式和分布式计算),Hadoop 会在 /tmp 目录下生成临时数据;在做高可用实验时之前,需要清空之前的数据,删除所有结点的 /tmp/ 目录中的所有内容;
[hadoop@server5 ~]$ rm -fr /tmp/*
[hadoop@server6 ~]$ rm -fr /tmp/*
[hadoop@server7 ~]$ rm -fr /tmp/*
[hadoop@server8 ~]$ rm -fr /tmp/*
在典型的 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 的位置,并向它们发送块文件所在的位置及心跳。
(3)安装 zookeeper,搭建 ZK 集群
搭建的ZK集群至少3台,
注意:集群通常是奇数的,不要使用偶数个。
- 安装 zookeeper 并修改配置文件
在配置文件中写入 3 个集群结点,写入 DataNode 对应的 IP,server1 不是域名而是是服务器编号;
[hadoop@server5 ~]$ tar zxf zookeeper-3.4.9.tar.gz
[hadoop@server5 conf]$ pwd
/home/hadoop/zookeeper-3.4.9/conf
[hadoop@server5 conf]$ ls
configuration.xsl log4j.properties zoo_sample.cfg
[hadoop@server5 conf]$ cp zoo_sample.cfg zoo.cfg
[hadoop@server5 conf]$ vim zoo.cfg
30 server.1=172.25.25.6:2888:3888
31 server.2=172.25.25.7:2888:3888
32 server.3=172.25.25.8:2888:3888
##其中 2888 端口用于数据同步和其他通信,3888用于集群结点之间的选举
- 在 Datenode 上新建数据目录
此目录为上面编辑配置文件中的目录/tmp/zookeeper
;并在该目录中新建一个文件名为myid
,将编号写入其中;
[hadoop@server6 ~]$ mkdir /tmp/zookeeper
[hadoop@server6 ~]$ echo 1 > /tmp/zookeeper/myid
[hadoop@server7 ~]$ mkdir /tmp/zookeeper
[hadoop@server7 ~]$ echo 2 > /tmp/zookeeper/myid
[hadoop@server8 ~]$ mkdir /tmp/zookeeper
[hadoop@server8 ~]$ echo 3 > /tmp/zookeeper/myid
(4)启动 zookeeper
依次启动三个结点;
[hadoop@server6 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@server7 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@server8 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@server6 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
[hadoop@server7 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
[hadoop@server8 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
根据身份查看的信息可知,选举 server7 为 leader ,其余的为 follower;
查看进程状态信息,三个结点的进程信息都没有问题;
[hadoop@server6 zookeeper-3.4.9]$ jps
3731 QuorumPeerMain
3791 Jps
[hadoop@server7 zookeeper-3.4.9]$ jps
3798 Jps
3735 QuorumPeerMain
[hadoop@server8 zookeeper-3.4.9]$ jps
3784 Jps
3727 QuorumPeerMain
(5)分布式集群
在两个 master
上做设置,一定要注意解析。
- 编辑核心配置文件
(1)为了完成高可用的配置(server1挂了之后,server5进行接管),在核心配置文件中 NN 地址不能固定设置,应该写masters;
注意:这里到底server1是master,还是server5是master,取决于二者谁写入数据 。
(2)还要告诉masters,ZK集群的位置在哪里
[hadoop@server5 hadoop]$ pwd
/home/hadoop/hadoop/etc/hadoop
[hadoop@server5 hadoop]$ vim core-site.xml
19 <configuration>
20 <property>
21 <name>fs.defaultFS</name>
22 <value>hdfs://masters</value>
23 </property>
24
25
26 <property>
27 <name>ha.zookeeper.quorum</name>
28 <value>172.25.25.6:2181,172.25.25.7:2181,172.25.25.8:2181</value>
29 </property>
30 </configuration>
- 编辑 hdfs 分布式文件系统
[hadoop@server5 hadoop]$ vim hdfs-site.xml
19 <configuration>
20
21 <property>
22 <name>dfs.replication</name>
23 <value>3</value>
24 </property>
25
26 <property>
27 <name>dfs.nameservices</name>
28 <value>masters</value>
29 </property>
30
31 <property>
32 <name>dfs.ha.namenodes.masters</name>
33 <value>h1,h2</value>
34 </property>
35
36 <property>
37 <name>dfs.namenode.rpc-address.masters.h1</name>
38 <value>172.25.25.5:9000</value>
39 </property>
40
41 <property>
42 <name>dfs.namenode.http-address.masters.h1</name>
43 <value>172.25.25.5:9870</value>
44 </property>
45
46 <property>
47 <name>dfs.namenode.rpc-address.masters.h2</name>
48 <value>172.25.25.9:9000</value>
49 </property>
50
51 <property>
52 <name>dfs.namenode.http-address.masters.h2</name>
53 <value>172.25.25.9:9870</value>
54 </property>
55
56 <property>
57 <name>dfs.namenode.shared.edits.dir</name>
58 <value>qjournal://172.25.25.6:8485;172.25.25.7:8485;172.25.25.8:8485/masters</value>
59 </property>
60
61 <property>
62 <name>dfs.journalnode.edits.dir</name>
63 <value>/tmp/journaldata</value>
64 </property>
65
66 <property>
67 <name>dfs.ha.automatic-failover.enabled</name>
68 <value>true</value>
69 </property>
70
71 <property>
72 <name>dfs.client.failover.proxy.provider.masters</name>
73 <value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value>
74 </property>
75
76 <property>
77 <name>dfs.ha.fencing.methods</name>
78 <value>
79 sshfence
80 shell(/bin/true)
81 </value>
82 </property>
83
84 <property>
85 <name>dfs.ha.fencing.ssh.private-key-files</name>
86 <value>/home/hadoop/.ssh/id_rsa</value>
87 </property>
88
89 <property>
90 <name>dfs.ha.fencing.ssh.connect-timeout</name>
91 <value>30000</value>
92 </property>
93
94 </configuration>
1.设置副本数为3
2.指定 HDFS 的 masterservices 为 masters
,必须和核心配置文件中的名称保持一致
3.定义 master 两台主机的名字,此处定义的是 h1 和 h2
4.告诉 HDFS,h1 是谁以及它的 rpc 通信端口和 http 通信端口
5.告诉HDFS,h2 是谁以及它的 rpc 通信端口和 http 通信端口
6.设定日志节点,此处日志节点和ZK节点在一起
7.日志节点在本地磁盘中存储数据的路径,也在/tmp中
8.开启 NameNode
失败自动切换
9.失败的自动切换方式
10.隔离机制(每个隔离机制占用一行)
11.免密
12.隔离机制的超时时间
- 启动
启动一定要注重启动的顺序,先是ZK集群(前面已经启动了),再启动日志节点(如果第一次启动 hdfs,那么必须先启动日志节点journalnode ),再启动 hdfs 集群;
启动日志节点
[hadoop@ser[hadoop@server6 hadoop]$ pwd
/home/hadoop/hadoop
ver6 hadoop]$ bin/hdfs --daemon start journalnode
[hadoop@server7 hadoop]$ bin/hdfs --daemon start journalnode
[hadoop@server8 hadoop]$ bin/hdfs --daemon start journalnode
[hadoop@server8 hadoop]$ jps
4036 JournalNode
4054 Jps
3727 QuorumPeerMain
启动集群
(1)先格式化
注:上面启动日志节点后,连接有些慢,这样会导致格式化出现差错,多格式化几次就好。但也要注意,如果格式化次数不合适,会导致 NameNode 上面的ID号和 DataNode 记录的 NameNode 号不一致。
[hadoop@server5 hadoop]$ pwd
/home/hadoop/hadoop
[hadoop@server5 hadoop]$ bin/hdfs namenode -format
(2)将 server5 上的数据拷贝到 server9 上
[hadoop@server5 hadoop]$ scp -r /tmp/hadoop-hadoop 172.25.25.9:/tmp
[root@server9 ~]# ll /tmp/
total 0
drwxrwxr-x 3 hadoop hadoop 17 May 3 23:29 hadoop-hadoop
(3)格式化ZK
zkfc故障控制器
[hadoop@server5 hadoop]$ bin/hdfs zkfc -formatZK
(4)在 leader
上用命令查看谁写入的数据
在/home/hadoop/zookeeper-3.4.9
下调用脚本bin/zkCli.sh
是谁写入的数据;
如图所示,此时还没有 master 写入的数据信息;
(5)启动hdfs
[hadoop@server5 hadoop]$ pwd
/home/hadoop/hadoop
[hadoop@server5 hadoop]$ sbin/start-dfs.sh
Starting namenodes on [server5 server9]
Starting datanodes
Starting journal nodes [server6 server8 server7]
server6: journalnode is running as process 4167. Stop it first.
server7: journalnode is running as process 4125. Stop it first.
server8: journalnode is running as process 4036. Stop it first.
Starting ZK Failover Controllers on NN hosts [server5 server9]
[hadoop@server5 hadoop]$ jps
4322 NameNode
4678 DFSZKFailoverController ##故障控制器
4730 Jps
可以看到体时日志已经启动了,所以只有在第一次启动时需要启动日志结点,后面在启动 hdfs 时会自动启动;
注:一旦启动高可用,之前的SecondNameNode
就会退化.
此时再次查看数据信息,可以看到是 server5 写入信息;
此时在网页查看时,可以看到三个结点的信息:
此时 server5 时 active 而 server9 是 standby 的状态:
故障切换
1.先上传一些文件,方便模拟故障
[hadoop@server5 hadoop]$ pwd
/home/hadoop/hadoop
[hadoop@server5 hadoop]$ bin/hdfs dfs -mkdir /user
[hadoop@server5 hadoop]$ bin/hdfs dfs -mkdir /user/hadoop
[hadoop@server5 hadoop]$ bin/hdfs dfs -put kkk
2021-05-04 00:02:39,687 INFO sasl.SaslDataTransferClient: SASL encryption trust check: localHostTrusted = false, remoteHostTrusted = false
2021-05-04 00:02:45,879 INFO sasl.SaslDataTransferClient: SASL encryption trust check: localHostTrusted = false, remoteHostTrusted = false
此时存的是三份:
- 强制下线 server5 上的 Namenode
[hadoop@server5 hadoop]$ jps
4322 NameNode
5059 Jps
4678 DFSZKFailoverController
[hadoop@server5 hadoop]$ kill 4322
[hadoop@server5 hadoop]$ jps
5090 Jps
4678 DFSZKFailoverController
[hadoop@server5 hadoop]$ bin/hdfs dfs -ls ##此时虽然进程已经结束,但是依然可以访问
Found 1 items
-rw-r--r-- 3 hadoop supergroup 209715200 2021-05-04 00:02 kkk
kill 进程之后,虽然看不到进程信息,但可以访问到之前上传的数据,此时server9
已经接管
在 ZK 集群中看到的信息也是 server9 写入的数据:
3.恢复server5
[hadoop@server5 hadoop]$ bin/hdfs --daemon start namenode
[hadoop@server5 hadoop]$ jps
5201 NameNode
4678 DFSZKFailoverController
5245 Jps
此时再次查看 server5 的状态时,可以看到其已经为 standby:
3. RM 高可用
- 编辑配置文件
yarn-site.xml
[hadoop@server5 hadoop]$ vim yarn-site.xml
15 <configuration>
16 <property>
17 <name>yarn.nodemanager.aux-services</name>
18 <value>mapreduce_shuffle</value>
19 </property<以上是关于hadoop 分布式文件系统的计算和高可用的主要内容,如果未能解决你的问题,请参考以下文章