上一篇文章,我们完成了hadoop的集群安装,但从机子的节点分布图中我们可以看到namenode只在master机子上存在,一旦该机子宕机,则HDFS停服,所以我们需要一种机制来保证namenode的高可用性,这种风险也存在于resourcemanager。本文将阐述使用zookeeper来保证namenode以及resourcemanager的高可用性。
1 系统、软件和约束前提
- 作者的三台机子分为
192.168.100.201 slave1
192.168.100.202 slave2
192.168.100.203 master - 完成在三台机上安装hadoop集群
https://www.jianshu.com/u/0b75036451ae - 完成在三台机子上安装zookeeper集群并启动
https://www.jianshu.com/p/48f142f876d4
2 操作【所有操作都由root完成】
2.1 关闭所有节点服务【zk可以不关】,清空之前的数据
ssh master;
hadoop-2.5.2/sbin/stop-all.sh
cd hadoop-2.5.2/dfs;
rm -rf *
mkdir data
mkdir name
# 其他两台机子也做相同清空操作
2.2 在master修改配置文件并拷贝
- 修改core-site.xml
<configuration>
<property>
<name>fs.defaultFS</name>
<value>hdfs://master:9000</value>
</property>
<property>
<name>hadoop.tmp.dir</name>
<value>file:/root/hadoop-2.5.2/tmp</value>
<description>Abase for other temporary directories.</description>
</property>
<property>
<name>fs.defaultFS</name>
<value>hdfs://myha01/</value>
</property>
<property>
<name>ha.zookeeper.quorum</name>
<value>master:2181,slave1:2181,slave2:2181</value>
</property>
<property>
<name>ha.zookeeper.session-timeout.ms</name>
<value>5000</value>
</property>
</configuration>
- 修改hdfs-site.xml
<configuration>
<property>
<name>dfs.namenode.secondary.http-address</name>
<value>master:50090</value>
</property>
<property>
<name>dfs.replication</name>
<value>2</value>
</property>
<property>
<name>dfs.namenode.name.dir</name>
<value>file:/root/hadoop-2.5.2/dfs/name</value>
</property>
<property>
<name>dfs.datanode.data.dir</name>
<value>file:/root/hadoop-2.5.2/dfs/data</value>
</property>
<!-- /meservice为myha01,需要和core-site.xml中的保持一致
dfs.ha.namenodes.[nameservice id]为在nameservice中的每一个NameNode设置唯一标示符。
配置一个逗号分隔的NameNode ID列表。这将是被DataNode识别为所有的NameNode。
例如,如果使用"myha01"作为nameservice ID,并且使用"nn1"和"nn2"作为NameNodes标示符
-->
<property>
<name>dfs.nameservices</name>
<value>myha01</value>
</property>
<!-- myha01下面有两个NameNode,分别是nn1,nn2 -->
<property>
<name>dfs.ha.namenodes.myha01</name>
<value>nn1,nn2</value>
</property>
<!-- nn1的RPC通信地址 -->
<property>
<name>dfs.namenode.rpc-address.myha01.nn1</name>
<value>master:9000</value>
</property>
<!-- nn1的http通信地址 -->
<property>
<name>dfs.namenode.http-address.myha01.nn1</name>
<value>master:50070</value>
</property>
<!-- nn2的RPC通信地址 -->
<property>
<name>dfs.namenode.rpc-address.myha01.nn2</name>
<value>slave1:9000</value>
</property>
<!-- nn2的http通信地址 -->
<property>
<name>dfs.namenode.http-address.myha01.nn2</name>
<value>slave1:50070</value>
</property>
<!-- 指定NameNode的edits元数据的共享存储位置。也就是JournalNode列表
该url的配置格式:qjournal://host1:port1;host2:port2;host3:port3/journalId
journalId推荐使用nameservice,默认端口号是:8485 -->
<property>
<name>dfs.namenode.shared.edits.dir</name>
<value>qjournal://master:8485;slave1:8485;slave2:8485/myha01</value>
</property>
<!-- 指定JournalNode在本地磁盘存放数据的位置 -->
<property>
<name>dfs.journalnode.edits.dir</name>
<value>/root/hadoop-2.5.2/data/journaldata</value>
</property>
<!-- 开启NameNode失败自动切换 -->
<property>
<name>dfs.ha.automatic-failover.enabled</name>
<value>true</value>
</property>
<!-- 配置失败自动切换实现方式 -->
<property>
<name>dfs.client.failover.proxy.provider.myha01</name>
<value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value>
</property>
<!-- 配置隔离机制方法,多个机制用换行分割,即每个机制暂用一行 -->
<property>
<name>dfs.ha.fencing.methods</name>
<value>
sshfence
</value>
</property>
<!-- 使用sshfence隔离机制时需要ssh免登陆 -->
<property>
<name>dfs.ha.fencing.ssh.private-key-files</name>
<value>/root/.ssh/id_rsa</value>
</property>
<!-- 配置sshfence隔离机制超时时间 -->
<property>
<name>dfs.ha.fencing.ssh.connect-timeout</name>
<value>30000</value>
</property>
<property>
<name>ha.failover-controller.cli-check.rpc-timeout.ms</name>
<value>60000</value>
</property>
</configuration>
- 修改yarn-site.xml
<configuration>
<!-- Site specific YARN configuration properties -->
<property>
<name>yarn.resourcemanager.hostname</name>
<value>master</value>
</property>
<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的cluster id -->
<property>
<name>yarn.resourcemanager.cluster-id</name>
<value>yrc</value>
</property>
<!-- 指定RM的名字 -->
<property>
<name>yarn.resourcemanager.ha.rm-ids</name>
<value>rm1,rm2</value>
</property>
<!-- 分别指定RM的地址 -->
<property>
<name>yarn.resourcemanager.hostname.rm1</name>
<value>master</value>
</property>
<property>
<name>yarn.resourcemanager.hostname.rm2</name>
<value>slave1</value>
</property>
<!-- 指定zk集群地址 -->
<property>
<name>yarn.resourcemanager.zk-address</name>
<value>master:2181,slave1:2181,slave2:2181</value>
</property>
<property>
<name>yarn.log-aggregation-enable</name>
<value>true</value>
</property>
<property>
<name>yarn.log-aggregation.retain-seconds</name>
<value>86400</value>
</property>
<!-- 启用自动恢复 -->
<property>
<name>yarn.resourcemanager.recovery.enabled</name>
<value>true</value>
</property>
<!-- 制定resourcemanager的状态信息存储在zookeeper集群上 -->
<property>
<name>yarn.resourcemanager.store.class</name>
<value>org.apache.hadoop.yarn.server.resourcemanager.recovery.ZKRMStateStore</value>
</property>
</configuration>
- 修改slaves
master
slave1
slave2
- 拷贝这些配置文件到其他机子
cd /root/hadoop-2.5.2/etc/hadoop
scp * slave1:$PWD
scp * slave2:$PWD
2.3 启动相关服务
- 1 在master启动journalnode
cd /root/hadoop-2.5.2/sbin
./hadoop-daemons.sh start journalnode
- 2 在master上格式化zkfc
cd /root/hadoop-2.5.2/bin
./hdfs zkfc -formatZK
- 3 在master上格式化namenode
cd /root/hadoop-2.5.2/bin
./hdfs namenode -format
- 4 在master上启动namenode
cd /root/hadoop-2.5.2/sbin
./hadoop-daemon.sh start namenode
- 5 在slave1上启动standby的namenode
cd /root/hadoop-2.5.2/bin
./hdfs namenode -bootstrapStandby
cd /root/hadoop-2.5.2/sbin
./hadoop-daemon.sh start namenode
- 6 在master上设置主
cd /root/hadoop-2.5.2/bin
./hdfs haadmin -transitionToActive --forcemanual nn1
- 7 在master上启动datanode
cd /root/hadoop-2.5.2/sbin
./hadoop-daemons.sh start datanode
- 8 在master上启动zkfc
cd /root/hadoop-2.5.2/sbin
./hadoop-daemons.sh start zkfc
- 9 在master和slave1上启动yarn
cd /root/hadoop-2.5.2/sbin
./start-yarn.sh
全部启动完毕,每个节点执行jps,进程信息如下:
master:
[root@master ~]# jps
14962 Jps
12474 NameNode
12161 JournalNode
12757 DataNode
14838 NodeManager
7930 QuorumPeerMain
13757 ResourceManager
13366 DFSZKFailoverController
slave1:
[root@slave1 ~]# jps
10564 DataNode
10378 NameNode
12161 NodeManager
8736 QuorumPeerMain
11231 DFSZKFailoverController
10159 JournalNode
12287 Jps
12673 ResourceManager
slave2:
[root@slave2 ~]# jps
12706 Jps
11449 NodeManager
10764 QuorumPeerMain
10884 JournalNode
11171 DataNode
2.4 测试
- 测试namenode的高可用性
在浏览器中输入http://192.168.100.201:50070/dfshealth.html#tab-overview,回车:standby节点
在浏览器中输入http://192.168.100.203:50070/dfshealth.html#tab-overview,回车:active节点
此时,在203节点上找到namenode的pid,kill此进程,如下图所示:杀掉主namenode
再去访问http://192.168.100.201:50070/dfshealth.html#tab-overview:由之前的standby变成了active,备升级为主 - 测试resourcemanager的高可用性
作者的resourcemanager分别位于master以及slave1,请读者根据实际情况设置。按以下步骤操作:
- 在master上开始词频统计
- 在词频统计的过程中,杀掉master上的resourcemanager,词频统计还是会完成
- 说明resourcemanager的高可用性。
至此,我们完成了namenode、resourcemanager的高可用性,并完成了测试。