CentOS7.4版本Hadoop高可用模式搭建

前言:仅用于学习交流,配置文件可能和工作中有写差别。本次实验用到的软件有:

  • hadoop-2.6.0.tar.gz
  • jdk-8u161-linux-x64.tar.gz
  • zookeeper-3.4.5.tar.gz

搭建前提:已完成hadoop完全分布式所需的所有操作。

计划
一主三从的完全分布式hadoop集群,节点名称:master、slave、slave2、slave3
选择master节点和slave3节点为Namenode节点

一、搭建HA模式,修改相关配置文件

1. 创建存放HA的文件夹,修改相关配置

(1) 创建存放高可用的hadoop文件Ha

[root@master ~]# mkdir /usr/local/Ha

(2)复制完全分布式hadoop到Ha文件中

[root@master ~]# cp -r /usr/local/hadoop/hadoop-2.6.0/* /usr/local/Ha/
说明:-r的意思是递归复制,将目录下的所有文件包含子目录一起处理

(3)删除Ha文件中的存放集群数据和日志的文件hadoopdata和logs文件夹

[root@master ~]# cd /usr/local/Ha/
[root@master Ha]# ls -l
[root@master Ha]# rm -rf hadooptmpdata/
[root@master Ha]# rm -rf logs/
[root@master Ha]# ls -l

在这里插入图片描述

2. 修改配置文件

(1)修改配置文件core-site.xml

[root@master Ha]# cd etc/hadoop/
[root@master hadoop]# vim core-site.xml

原文件里面配置hadoop完全分布式的配置项:
在这里插入图片描述
修改文件中的配置项、添加配置项,文件如下所示:

<configuration>

<!--设置存放hadoop运行时产生数据的目录-->
<property>
        <name>hadoop.tmp.dir</name>
        <value>/usr/local/Ha/hadoopHAdata</value>
</property>

<!--指定hdfs中namenode的地址-->
<!--mycluster是一个集群的名称,是由两个NameNode的地址组成,可以自定义,但是后面有出先mycluster的地方,要和这里的名字保持一致-->
<property>
        <name>fs.defaultFS</name>
        <value>hdfs://mycluster</value>
</property>

<!--设置一下故障转移需要的zookeeper集群-->
<property>
        <name>ha.zookeeper.quorum</name>
        <value>master:2181,slave:2181,slave2:2181,slave3:2181</value>
</property>
</configuration>

效果如下:
在这里插入图片描述
保存退出。

(2)修改配置文件hdfs-site.xml

删除原有的配置,添加以下配置:

<configuration>

<!--完全分布式集群名称-->
<property>
        <name>dfs.nameservices</name>
        <value>mycluster</value>
</property>

<!--集群中NameNode节点有那些-->
<property>
        <name>dfs.ha.namenodes.mycluster</name>
        <value>nn1,nn2</value>
</property>

<!--nn1的RPC通信地址-->
<property>
        <name>dfs.namenode.rpc-address.mycluster.nn1</name>
        <value>master:9000</value>
</property>

<!--nn2的RPC通信地址-->
<property>
        <name>dfs.namenode.rpc-address.mycluster.nn2</name>
        <value>slave3:9000</value>
</property>
<!--nn1的http通信地址-->
<property>
        <name>dfs.namenode.http-address.mycluster.nn1</name>
        <value>master:50070</value>
</property>

<!--nn2的http通信地址-->
<property>
        <name>dfs.namenode.http-address.mycluster.nn2</name>
        <value>slave3:50070</value>
</property>

<!--指定NameNode元数据在JournalNode上的存放位置-->
<property>
        <name>dfs.namenode.shared.edits.dir</name>
        <value>qjournal://master:8485;slave:8485;slave2:8485;slave3:8485/mycluster</value>
</property>

<!--设置隔离机制,即同一时刻只能有同一台服务器对外响应-->
<property>
        <name>dfs.ha.fencing.methods</name>
        <value>sshfence</value>
</property>

<!--使用隔离机制时需要ssh无密钥登陆,这里是私钥不是公钥-->
<property>
<name>dfs.ha.fencing.ssh.private-key-files</name>
        <value>/root/.ssh/id_rsa</value>
</property>

<!--声明journalnode服务器存储目录-->
<property>
        <name>dfs.journalnode.edits.dir</name>
        <value>/usr/local/Ha/hadoopHAdata/jn</value>
</property>

<!--启动自动故障切换 ,一定要加上-->
<property>                      				 
		<name>dfs.ha.automatic-failover.enabled.mycluster</name>        
        <value>true</value>
</property>

<!--关闭权限检查-->
<property>
        <name>dfs.permissions.enable</name>
        <value>false</value>
</property>

<!--访问代理类:client,mycluster,active配置自动切换实现方式-->
<property>
        <name>dfs.client.failover.proxy.provider.mycluster</name>
        <value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value>
</property>

<property>
        <name>dfs.ha.automatic-failover.enable</name>
        <value>true</value>
</property>

</configuration>

其中注意隔离机制时需要ssh无密钥登陆的配置项,好多博客都说这个配置项是用的公钥,这里应该是私钥,看了好几个博客,他们的名字都打错了,id_rsa.pub是公钥,id_rsa是私钥;还有就是一定要添加启动自动故障切换的配置项,要不然后面在nn1节点上初始化HA在zookeepe中的状态时会出错。

效果如下:
在这里插入图片描述
保存退出。

(3)修改配置文件yarn-site.xml

删除全部配置,添加以下配置:

<configuration>

<!--mapreduce获取数据的方式-->
<property>
        <name>yarn.nodemanager.aux-services</name>
        <value>mapreduce_shuffle</value>
</property>

<!--启用resourcemanager ha-->
<property>
        <name>yarn.resourcemanager.ha.enabled</name>
        <value>true</value>
</property>

<!--声明两台resourcemanager的地址-->
<property>
        <name>yarn.resourcemanager.cluster-id</name>
        <value>cluster-yarn1</value>
</property>
<property>
        <name>yarn.resourcemanager.ha.rm-ids</name>
        <value>rm1,rm2</value>
</property>
<property>
        <name>yarn.resourcemanager.hostname.rm1</name>
        <value>master</value>
</property>
<property>
        <name>yarn.resourcemanager.hostname.rm2</name>
        <value>slave3</value>
</property>

<!--指定zookeeper集群的地址-->
<property>
        <name>yarn.resourcemanager.zk-address</name>
        <value>master:2181,slave:2181,slave2:2181,slave3:2181</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>

效果如下:
在这里插入图片描述
保存退出。

(4)修改配置文件slaves

在此文件中添加:master
添加master的原因:slaves文件指明哪些节点运行DateNode进程。
在这里插入图片描述

(5)将Ha文件分发给子节点,并放在/usr/local目录下

[root@master ~]# scp -r /usr/local/Ha root@slave:/usr/local/
[root@master ~]# scp -r /usr/local/Ha root@slave2:/usr/local/
[root@master ~]# scp -r /usr/local/Ha root@slave3:/usr/local/

二、开启集群、各个进程

(1)查看java进程,如果完全分布式hadoop进程没有关闭,则需要关闭。

[root@master ~]# /usr/local/hadoop/hadoop-2.6.0/sbin/stop-all.sh

在这里插入图片描述

(2)准备工作:开启zookeeper服务并查看服务进程

在这里插入图片描述

(3)启动各个进程

① 每个节点上,启动journalnode服务:

可以在每个节点运行命令:/usr/local/Ha/sbin/hadoop-daemon.sh start journalnode
也可以在master节点上运行:也可以是:/usr/local/Ha/sbin/hadoop-daemons.sh start journalnode
两者的区别在与:hadoop-daemons.sh可以启动给所有节点的journalnode服务

[root@master ~]# /usr/local/Ha/sbin/hadoop-daemons.sh start journalnode

在这里插入图片描述

② 在master(nn1)节点上格式化hdfs文件系统

[root@master ~]# /usr/local/Ha/bin/hdfs namenode -format

出现以下内容说明成功:

INFO common.Storage: Storage directory /usr/local/Ha/hadoopHAdata/dfs/name has beensuccessfully formatted.

在这里插入图片描述

③ 在master(nn1)节点上初始化HA在Zookeeper中状态:

[root@master ~]# /usr/local/Ha/bin/hdfs zkfc -formatZK

出现下图所示信息表示成功:
在这里插入图片描述
如果出现下图这种错误,就在各个节点的hdfs-site.xml文件中添加如下配置:

<!--启动自动故障切换 -->
<property>                      
		<name>dfs.ha.automatic-failover.enabled.mycluster</name>        
        <value>true</value>
</property>

在这里插入图片描述

④ 在master(nn1)节点上启动namenode:

[root@master ~]# /usr/local/Ha/sbin/hadoop-daemon.sh start namenode

在这里插入图片描述
就只有master节点有NameNode进程,其他节点是没有的。

⑤ 在slave3(nn2)节点上同步master(nn1)节点的元数据信息:

[root@slave3 ~]# /usr/local/Ha/bin/hdfs namenode -bootstrapStandby

出现下图显示状态为0则为成功!
在这里插入图片描述
在这里插入图片描述

⑥ 在slave3(nn2)上开启namenode服务

[root@slave3 ~]# /usr/local/Ha/sbin/hadoop-daemon.sh start namenode

在这里插入图片描述

⑦ 在master节点启动各个节点的DataNode进程,或者一个节点一个节点启动

一个节点一个节点的启动:
/usr/local/Ha/sbin/hadoop-daemon.sh start datanode
在master节点启动所有节点的DataNode:
/usr/local/Ha/sbin/hadoop-daemons.sh start datanode

这里选择在master节点启动所有节点的DataNode进程:

[root@master ~]# /usr/local/Ha/sbin/hadoop-daemons.sh start datanode

jps查看各个节点进程:
在这里插入图片描述

⑧ 在其中一个NameNode(master或slave3)节点上启动DFSZK Failover Controller,那个机器上启动,那个机器的NameNode状态就是Active NameNode。

[root@master ~]# /usr/local/Ha/sbin/hadoop-daemons.sh start zkfc

jps查看进程,发现只有NameNode节点有DFSZKFailoverController进程,其他的节点没有。
在这里插入图片描述
出现以下信息的意思可能你的配置文件中的涉及到zookeeper方面的配置中,端口配置错了,或者是由于其他节点不是NameNode节点,所以他会查找不到。
属于第一种情况的,两个NameNode节点中只会有一个DFSZKFailoverController进程。
属于第二种情况的在端口没有配置错的情况下属于正常。
在这里插入图片描述

⑨ 查看NameNode状态
  • 通过浏览器查看NameNode节点(master、slave3)的状态
    访问:master:50070和slave3:50070,可以看到由于我是在master节点启动的zkfc,所以master节点的NameNode状态为active,slave3为standby。
    在这里插入图片描述
  • 通过命令查看状态:

master节点上:
[root@master ~]# /usr/local/Ha/bin/hdfs haadmin -getServiceState nn1
[root@master ~]# /usr/local/Ha/bin/hdfs haadmin -getServiceState nn2
在这里插入图片描述

⑩ 启动Yarn、终止NameNode节点为active的NameNode进程、关闭所有进程
  • 启动Yarn

master节点: /usr/local/Ha/sbin/start-yarn.sh
slave3节点:/usr/local/Ha/sbin/yarn-daemon.sh start resourcemanager

在这里插入图片描述
在这里插入图片描述
查看服务状态:

[root@master ~]# /usr/local/Ha/bin/yarn rmadmin -getServiceState rm1
[root@master ~]# /usr/local/Ha/bin/yarn rmadmin -getServiceState rm2
在这里插入图片描述

  • 终止NameNode节点为active的NameNode进程
    原来状态:
    在这里插入图片描述
    在active状态的NameNode对应的节点去执行以下命令(我这里是master节点):

[root@master ~]# jps
[root@master ~]# kill -9 9163
[root@master ~]# jps
在这里插入图片描述

刷新网页:
在这里插入图片描述
发现slave3的NameNode节点状态变为:active,master节点死机。说明高可用hadoop搭建成功!

  • 关闭所有进程:
    master节点上:

[root@master ~]# /usr/local/Ha/sbin/stop-dfs.sh
[root@master ~]# /usr/local/Ha/sbin/stop-yarn.sh
[root@master ~]# zkServer.sh stop

(4) 启动HA集群

[root@master ~]# /usr/local/Ha/sbin/start-all.sh

三、提示错误解决

(1)提示没有开启自动故障切换

解决方法:在配置文件hdfs-site.xml中添加如下配置项:

<!--启动自动故障切换 -->
<property>                      
		<name>dfs.ha.automatic-failover.enabled.mycluster</name>        
        <value>true</value>
</property>

在这里插入图片描述

(2)slave: Exception in thread “main” org.apache.hadoop.HadoopIllegalArgumentException: Could not get the namenode ID of this node. You may run zkfc on the node other than namenode.slave:atorg.apache.hadoop.hdfs.tools.DFSZKFailoverController.create(DFSZKFailoverController.java:128)

正常情况下:出现以下信息的意思是由于其他节点不是NameNode节点,所以他会查找不到。
在这里插入图片描述
出问题的时候:出现以下信息的意思可能你的配置文件中的涉及到zookeeper方面的配置项中,端口配置有误。
属于第一种情况的,两个NameNode节点中只会有一个DFSZKFailoverController进程。
属于第二种情况的在端口没有配置错误的情况下属于正常。

如果觉得作者的这篇文章对你有帮助,可以点点赞关注一下哦~。谢谢你的支持!


版权声明:本文为zzp28218原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。