zookeeper 高可用
实验环境
共需要5台虚拟机server1-5。因为Zookeeper 集群至少三台,总节点数为奇数个。2.3.4为zookeeper的节点
- rhel7.3
hostname | ip |
---|---|
server1(NameNode) | 172.25.60.1 |
server2(JournalNode) | 172.25.60.2 |
server3 (JournalNode) | 172.25.60.3 |
server4(JournalNode) | 172.25.60.4 |
server5 (NameNode) | 172.25.60.5 |
-
实验之前先将原来所有配置过的虚拟机上的服务关闭,并将环境清理干净搭
-
zookeeper在一个节点上下载zookeper并解压
-
在解压后的目录下添加节点信息
-
各节点配置文件相同,并且需要在/tmp/zookeeper 目录中创建 myid 文件,写入一个唯一的数字,取值范围在 1-255
-
开启服务
-
并查看各节点状态(一个主节点(server4),两个从节点)
-
在一个从节点server2上进入命令行
-
在server1上进行进行hadoop的配置详解
-
指定hdfs的namenode为master;指定zookeeper集群主机地址;指定 hdfs 的 nameservices 为 masters,和 core-site.xml 文件中的设置保持一致masters 下面有两个 namenode 节点,分别是 h1 (server1)和 h2(server5);指定 h1 节点的 rpc 通信地址;指定 h1 节点的 http 通信地址;指定 h2 节点的 rpc 通信地址;指定 h2 节点的 http 通信地址;指定 NameNode 元数据在 JournalNode 上的存放位置;指定 JournalNode 在本地磁盘存放数据的位置;开启 NameNode 失败自动切换;配置失败自动切换实现方式;配置隔离机制方法,每个机制占用一行;使用 sshfence 隔离机制时需要 ssh 免密码;配置 sshfence 隔离机制超时时间
-
启动 hdfs 集群(按顺序启动)在三个 DN 上依次启动
-
zookeeper 集群传递配置文件搭建高可用,先格式化HDFS 集群(如果格式化不成功,就多尝试几遍即可)
-
Namenode 数据默认存放在/tmp,需要把数据拷贝到 h2上
scp -r /tmp/hadoop-hadoop 172.25.60.5:/tmp
-
格式化 zookeeper (只需在 h1 上执行即可)
-
启动 hdfs 集群(只需在 h1 上执行即可):
sbin/start-dfs.sh
-
浏览器测试显示1上是active,5是standby
-
在server1上创建目录并上传文件
-
此时在浏览器上可以看到
-
停掉server1,server5的状态就变成了active
-
也可以通过server2上的命令行查看状态
-
1虽然关了,但是上传的文件通过5还可以看到的
-
重新打开1.变成standby
yarn高可用
- 编辑 mapred-site.xml 文件
<configuration>
<!-- 指定 yarn 为 MapReduce 的框架 -->
<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>
</configuration>
- 编辑 yarn-site.xml 文件
<configuration>
<!-- 配置可以在 nodemanager 上运行 mapreduce 程序 -->
<property>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
</property>
<!-- 激活 RM 高可用 -->
<property>
<name>yarn.resourcemanager.ha.enabled</name>
<value>true</value>
</property><!-- 指定 RM 的集群 id -->
<property>
<name>yarn.resourcemanager.cluster-id</name>
<value>RM_CLUSTER</value>
</property>
<!-- 定义 RM 的节点-->
<property>
<name>yarn.resourcemanager.ha.rm-ids</name>
<value>rm1,rm2</value>
</property>
<!-- 指定 RM1 的地址 -->
<property>
<name>yarn.resourcemanager.hostname.rm1</name>
<value>172.25.60.1</value>
</property>
<!-- 指定 RM2 的地址 -->
<property>
<name>yarn.resourcemanager.hostname.rm2</name>
<value>172.25.60.5</value>
</property>
<!-- 激活 RM 自动恢复 -->
<property>
<name>yarn.resourcemanager.recovery.enabled</name>
<value>true</value>
</property>
<!-- 配置 RM 状态信息存储方式,有 MemStore 和 ZKStore-->
<property>
<name>yarn.resourcemanager.store.class</name>
<value>org.apache.hadoop.yarn.server.resourcemanager.recovery.ZKRMStateStore</
value>
</property>
<!-- 配置为 zookeeper 存储时,指定 zookeeper 集群的地址 -->
<property>
<name>yarn.resourcemanager.zk-address</name>
<value>172.25.60.2:2181,172.25.60.3:2181,172.25.60.4:2181</value>
</property>
</configuration>
-
启动 yarn 服务
sbin/start-yarn.sh
-
RM2 上需要手动启动
sbin/yarn-daemon.sh start resourcemanager
最好是把 RM 与 NN 分离运行,这样可以更好的保证程序的运行性能。 -
测试 yarn 故障切换
[hadoop@server1 hadoop]$ jps
5918 Jps
2163 NameNode
1739 DFSZKFailoverController
5127 ResourceManager
[hadoop@server1 hadoop]$ kill -9 51271
-
浏览器输入172.25.60.1:8088(active),或者172.25.60.5:8088(standby)
-
进行故障切换检测
[hadoop@server1 hadoop]$ jps
1606 NameNode
2409 Jps
1900 DFSZKFailoverController
2335 ResourceManager
[hadoop@server1 hadoop]$ kill -9 2335 ##结束当前master进程 [hadoop@server1 hadoop]$ jps
1606 NameNode
2839 Jps
1900 DFSZKFailoverController
- 浏览器输入172.25.60.5:8088,显示active
- 恢复server1的服务
[hadoop@server1 hadoop]$ pwd
/home/hadoop/hadoop
[hadoop@server1 hadoop]$ sbin/yarn-daemon.sh start resourcemanager
starting resourcemanager, logging to /home/hadoop/hadoop-2.7.3/logs/yarn-hadoop-resourcemanager-server1.out
[hadoop@server1 hadoop]$ jps
2897 ResourceManager
1606 NameNode
1900 DFSZKFailoverController
2926 Jps
- 网页查看server1的状态为standby,作为备用节点