hadoop大数据(下)HDFS高可用集群、RM高可用集群
- 1、高可用介绍
- 2、hadoop高可用
- (1)Zookeeper 集群搭建
- (2)hadoop-HA搭建
- (3)测试
- 3、YARN – ResourceManager高可用
- (1)RM资源管理器高可用部署
- (2)测试
- 4、补充
本文接上篇文章hadoop大数据(上)
1、高可用介绍
在前面的部署中,NN节点只有一个,一旦他down了,整个系统就瘫痪了,所以在典型的 HA 集群中,通常有两台不同的机器充当 NN。在任何时间,只有一台机器处于Active 状态;另一台机器是处于 Standby 状态。Active NN 负责集群中所有客户端的操作;而 Standby NN 主要用于备用,它主要维持足够的状态,如果必要,可以提供快速的故障恢复。
为了让 Standby NN 的状态和 Active NN 保持同步,即元数据保持一致,它们都将会和JournalNodes 守护进程通信。一旦 Active NN出现故障,Standby NN 将会保证从 JNs 中读出了全部的 Edits,然后切换成 Active 状态。Standby NN 读取全部的 edits 可确保发生故障转移之前,是和 Active NN 拥有完全同步的命名空间状态。为了提供快速的故障恢复,Standby NN 也需要保存集群中各个文件块的存储位置。为了实现这个,集群中所有的 Database 将配置好 Active NN 和 Standby NN 的位置,并向它们发送块文件所在的位置及心跳,如下图所示
2、hadoop高可用
实验准备五台虚拟机,准备Zookeeper的压缩包
虚拟机ip | 主机名 | 角色 |
172.25.77.1 | server1 | NameNode、ResourceManager、DFSZKFailoverController |
172.25.77.5 | server5 | NameNode、ResourceManager、DFSZKFailoverController |
172.25.77.2 | server2 | DataNode、NodeManager、JournalNode、QuorumPeerMain |
172.25.77.3 | server3 | DataNode、NodeManager、JournalNode、QuorumPeerMain |
172.25.77.4 | server4 | DataNode、NodeManager、JournalNode、QuorumPeerMain |
(1)Zookeeper 集群搭建
server1首先把之前的实验环境都给停掉,jps查看没有任何进程了,删除/tmp,就把hadoop的数据都清理了,保持纯净
server2删除/tmp,保持纯净
server3删除/tmp,保持纯净
server4删除/tmp,保持纯净
server5创建hodoop用户,安装nfs
server5把共享的目录挂载到自己的/home/hadoop,切入hadoop用户
server1解压Zookeeper ,由于是nfs系统全部节点都可共用
server2进入zookeeper-3.4.9/conf
,复制一份配置文件,编辑 zoo.cfg 文件。创建目录/tmp/zookeeper
加入三个zk节点的ip,这里172.25.77.2 在zk集群中编号为1,172.25.77.3 在zk集群中编号为2,172.25.77.4 在zk集群中编号为3。2888端口是用来数据同步的,3888端口是用来选举leader的
根据每个节点自己的编号,把编号写入/tmp/zookeeper/myid,server2写1
server3写2
server4写3
server2进入zookeeper-3.4.9,开启zkserver,可以查看状态为follower
server3进入zookeeper-3.4.9,开启zkserver,可以查看状态为leader(随机选举的身份)
server4进入zookeeper-3.4.9,开启zkserver,可以查看状态为follower
[hadoop@server2 zookeeper-3.4.9]$ jps
4338 QuorumPeerMain
4868 Jps
[hadoop@server3 zookeeper-3.4.9]$ jps
5338 QuorumPeerMain
5868 Jps
[hadoop@server4 zookeeper-3.4.9]$ jps
6338 QuorumPeerMain
7868 Jps
(2)hadoop-HA搭建
编辑etc/hadoop/core-site.xml
文件
<configuration>
<property>
<name>fs.defaultFS</name> %指定 hdfs 的 namenode 为 masters (名称可自定义,前后要一致)
<value>hdfs://masters</value>
</property>
<property>
<name>ha.zookeeper.quorum</name> %指定 zookeeper 集群主机地址
<value>172.25.77.2:2181,172.25.77.3:2181,172.25.77.4:2181</value>
</property>
</configuration>
编辑etc/hadoop/hdfs-site.xml 文件
[hadoop@server1 hadoop]$ cat hdfs-site.xml
<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
<!--
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License. See accompanying LICENSE file.
-->
<!-- Put site-specific property overrides in this file. -->
<configuration>
<property> %副本数为3
<name>dfs.replication</name>
<value>3</value>
</property>
<property> %指定 hdfs 的 nameservices 为 masters,和 core-site.xml 文件中的设置保持一致
<name>dfs.nameservices</name>
<value>masters</value>
</property>
<property> %masters 下面有两个 namenode 节点,分别是 h1 和 h2 (名称可自定义)
<name>dfs.ha.namenodes.masters</name>
<value>h1,h2</value>
</property>
<property> %指定 h1 节点的 rpc 通信地址
<name>dfs.namenode.rpc-address.masters.h1</name>
<value>172.25.77.1:9000</value>
</property>
<property> %指定 h1 节点的 http 通信地址
<name>dfs.namenode.http-address.masters.h1</name>
<value>172.25.77.1:9870</value>
</property>
<property> %指定 h2 节点的 rpc 通信地址
<name>dfs.namenode.rpc-address.masters.h2</name>
<value>172.25.77.5:9000</value>
</property>
<property> %指定 h2 节点的 http 通信地址
<name>dfs.namenode.http-address.masters.h2</name>
<value>172.25.77.5:9870</value>
</property>
<property> %指定 NameNode 元数据在 JournalNode 上的存放位置
<name>dfs.namenode.shared.edits.dir</name>
<value>qjournal://172.25.77.2:8485;172.25.77.3:8485;172.25.77.4:8485/masters</value>
</property>
<property> %指定 JournalNode 在本地磁盘存放数据的位置
<name>dfs.journalnode.edits.dir</name>
<value>/tmp/journaldata</value>
</property>
<property> %开启 NameNode 失败自动切换
<name>dfs.ha.automatic-failover.enabled</name>
<value>true</value>
</property>
<property> %配置失败自动切换实现方式
<name>dfs.client.failover.proxy.provider.masters</name>
<value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value>
</property>
<property> %配置隔离机制方法,每个机制占用一行
<name>dfs.ha.fencing.methods</name>
<value>
sshfence
shell(/bin/true)
</value>
</property>
<property> %使用 sshfence 隔离机制时需要 ssh 免密码
<name>dfs.ha.fencing.ssh.private-key-files</name>
<value>/home/hadoop/.ssh/id_rsa</value>
</property>
<property> %配置 sshfence 隔离机制超时时间
<name>dfs.ha.fencing.ssh.connect-timeout</name>
<value>30000</value>
</property>
</configuration>
server2开启journalnode,第一次启动 hdfs 必须先手动启动 journalnode(按照编号顺序依次开启),jps看到开启了 JournalNode
server3开启journalnode,jps看到开启了 JournalNode
server4开启journalnode,jps看到开启了 JournalNode
server1进入hadoop目录,格式化 HDFS 集群
Namenode 数据默认存放在/tmp,server1需要把数据拷贝到 server5
server1格式化 zookeeper (只需在 h1 上执行即可)
server2进入zk,作为一个查询的窗口,不要退出
可以查看到DFS虚拟目录(不要退出)
server1打开dfs,jps查看有DFSZKFailoverController(zk控制器)
返回serever2查看,现在的主机为server1,备机为server5
访问172.25.77.1:9870,可以看到server1为active
访问172.25.77.5:9870,可以看到server5为standby
server1创建hadoop目录,上传input目录到DFS
访问172.25.77.1:9870,可以看到上传的文件
(3)测试
现在杀掉server1
在server2查看,现在server5接替任务了
访问172.25.77.1:9870就失败了
现在需要访问172.25.77.5:9870,三个DN状态正常
现在server5是active
查看input也在,没有异常
想要恢复server1也很简单,只要开启server1节点即可
不过现在server5依然是active,因为没有必要切换,浪费资源
现在访问172.25.77.1:9870可以了,但是server1是standby
到此 hdfs 的高可用完成
3、YARN – ResourceManager高可用
(1)RM资源管理器高可用部署
编辑yarn-site.xml 文件
[hadoop@server1 hadoop]$ cat yarn-site.xml
<?xml version="1.0"?>
<!--
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License. See accompanying LICENSE file.
-->
<configuration>
<property> %配置可以在 nodemanager 上运行 mapreduce 程序
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
</property>
<property> %指定变量
<name>yarn.nodemanager.env-whitelist</name>
<value>JAVA_HOME,HADOOP_COMMON_HOME,HADOOP_HDFS_HOME,HADOOP_CONF_DIR,CLASSPATH_PREPEND_DISTCACHE,HADOOP_YARN_HOME,HADOOP_HOME,PATH,LANG,TZ,HADOOP_MAPRED_HOME</value>
</property>
<property> %激活 RM 高可用
<name>yarn.resourcemanager.ha.enabled</name>
<value>true</value>
</property>
<property> %指定 RM 的集群 id
<name>yarn.resourcemanager.cluster-id</name>
<value>RM_CLUSTER</value>
</property>
<property> %定义 RM 的节点
<name>yarn.resourcemanager.ha.rm-ids</name>
<value>rm1,rm2</value>
</property>
<property> %指定 RM1 的地址
<name>yarn.resourcemanager.hostname.rm1</name>
<value>172.25.77.1</value>
</property>
<property> %指定 RM2 的地址
<name>yarn.resourcemanager.hostname.rm2</name>
<value>172.25.77.5</value>
</property>
<property> %激活 RM 自动恢复
<name>yarn.resourcemanager.recovery.enabled</name>
<value>true</value>
</property>
<property> %配置 RM 状态信息存储方式,有 MemStore 和 ZKStore
<name>yarn.resourcemanager.store.class</name>
<value>org.apache.hadoop.yarn.server.resourcemanager.recovery.ZKRMStateStore</value>
</property>
<property> %配置为 zookeeper 存储时,指定 zookeeper 集群的地址
<name>yarn.resourcemanager.zk-address</name>
<value>172.25.77.2:2181,172.25.77.3:2181,172.25.77.4:2181</value>
</property>
</configuration>
server1开启yarn,jps查看出现ResourceManager
server5,jps查看出现ResourceManager
server3,jps查看出现NodeManager
server4,jps查看出现NodeManager
在server2查看,RM现在rm1是active
访问172.25.77.1:8088
,可以看到是active
访问172.25.77.5:8088
,可以看到是standby
(2)测试
杀掉server1的RM
server2查看,rm2(server5)自动接管active
访问172.25.77.5:8088
,可以看到是active
当然访问172.25.77.1:8088
失败
恢复也很简单,server1开启RM
但是server1现在是standby,因为没有必要浪费资源切换
4、补充
其他的集群都可以像上面一样搭建高可用,方法相同,比如hbase高可用等等,这里不再赘述