Hadoop HA集群配置及使用

在2.x版本中Hadoop HA
一台配置为Active Namenode,对外提供服务
若干台配置为:Standby Namenode,待机状态

集群规划

机器名hadoop2hadoop3hadoop4
namenodenn1nn2
resourcemanagerrm1rm2
HDFSNameNode DataNode JournalnodeNameNode DataNode JournalnodeDataNode Journalnode
YARNNodeManager ResourceManagerNodeManager ResourceManagerNodeManager

前提:
完成hadoop完全分布式zookeeper完全分布式环境、各台机器免密登录

三台机器配置文件如下:

core-site.xml

<configuration>
   <!-- 把两个 NameNode的地址组装成一个集群 mycluster -->
   <property>
     	<name>fs.defaultFS</name>
     	<value>hdfs://mycluster</value>
   </property>
   <!-- 指定 hadoop 运行时产生文件的存储目录 -->
   <property>
    	 <name>hadoop.tmp.dir</name>
     	 <value>/opt/soft/hadoop260/tmp</value>
   </property>
   <!-- 指定zookeeper地址 -->
   <!--zookeeper的ip/主机名和端口号(2181,即zookeeper接收客户端请求的端口号)-->
   <property>
     	<name>ha.zookeeper.quorum</name>
     	<value>192.168.197.120:2181,192.168.197.130:2181,192.168.197.140:2181</value>
   </property>
   <property>
    	 <name>hadoop.proxyuser.root.hosts</name>
    	 <value>*</value>
   </property>
   <property>
    	 <name>hadoop.proxyuser.root.groups</name>
    	 <value>*</value>
   </property>
</configuration>

hdfs-site.xml

<configuration>
	<!-- 完全分布式集群名称 -->
	<property>
	 	 <name>dfs.nameservices</name>
	  	 <value>mycluster</value>
	</property>
	<!-- 集群中 NameNode 节点都有哪些,这里是 nn1 和 nn2 -->
	<property>
	  	<name>dfs.ha.namenodes.mycluster</name>
	  	<value>nn1,nn2</value>
	</property>
	<!-- nn1 的 RPC 通信地址 -->
	<property>
	  	<name>dfs.namenode.rpc-address.mycluster.nn1</name>
	  	<value>192.168.197.120:9000</value>
	</property>
	<!-- nn2 的 RPC 通信地址 -->
	<property>
	 	 <name>dfs.namenode.rpc-address.mycluster.nn2</name>
	  	 <value>192.168.197.130:9000</value>
	</property>
	<!-- nn1 的 http 通信地址 -->
	<property>
	  	<name>dfs.namenode.http-address.mycluster.nn1</name>
	  	<value>192.168.197.120:50070</value>
	</property>
	<!-- nn2 的 http 通信地址 -->
	<property>
	  	<name>dfs.namenode.http-address.mycluster.nn2</name>
	  	<value>192.168.197.130:50070</value>
	</property>
	<!-- 指定 NameNode 元数据在 JournalNode 上的存放位置 -->
	<property>
	  	<name>dfs.namenode.shared.edits.dir</name>
	  	<value>qjournal://192.168.197.120:8485;192.168.197.130:8485;192.168.197.140: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>/opt/soft/hadoop260/data/jn</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.replication</name>
		  <value>3</value>
	</property>
	<!--secondarynamenode 访问地址-->
	<property>
		  <name>dfs.namenode.secondary.http-address</name>
		  <value>192.168.197.140:50090</value>
	</property>
	<!--自动故障转移-->
	<property>
		  <name>dfs.ha.automatic-failover.enabled</name>
		  <value>true</value>
	</property>
</configuration>

yarn-site.xml

<configuration>
	<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>
	<!--resourcemanager id 分配-->
	<property>
		<name>yarn.resourcemanager.ha.rm-ids</name>
		<value>rm1,rm2</value>
	</property>
	<!--每台主机对应一个resourcemanager id   rm1分配给hadoop2-->
	<property>
		<name>yarn.resourcemanager.hostname.rm1</name>
		<value>192.168.197.120</value>
	</property>
	<!--每台主机对应一个resourcemanager id   rm2分配给hadoop3-->
	<property>
		<name>yarn.resourcemanager.hostname.rm2</name>
		<value>192.168.197.130</value>
	</property>
	<!--指定 zookeeper 集群的地址-->
	<property>
		<name>yarn.resourcemanager.zk-address</name>
		<value>192.168.197.120:2181,192.168.197.130:2181,192.168.197.140: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>

mapred-site.xml

<configuration>
	<property>
		<name>mapreduce.framework.name</name>
		<value>yarn</value>
	</property>
</configuration>

搭建步骤

1.在各个 JournalNode 节点上,输入以下命令启动 journalnode 服务:

sbin/hadoop-daemon.sh start journalnode
(三台)jps:JournalNode 启动

2.在[nn1]上,对其进行格式化,并启动:

bin/hdfs namenode -format 
sbin/hadoop-daemon.sh start namenode
jps:NameNode 启动

3.在[nn2]上,同步 nn1 的元数据信息:

bin/hdfs namenode -bootstrapStandby 

4.启动[nn2]:

sbin/hadoop-daemon.sh start namenode
jps:NameNode 启动

5.查看 web 页面 192.168.197.120:50070和192.168.197.120:50070,此时nn1和nn2都是 standby状态

在这里插入图片描述在这里插入图片描述

6.确保hadoop2中datade clusterID、name clusterID,hadoop2中datade clusterID、name clusterID和hadoop4中datade clusterID 全都和hadoop2 name clusterID 保持一致。

a.[nn1]上查询hadoop的name中的VERSION ,复制clusterID。

cat /opt/soft/hadoop260/data/tmp/dfs/name/current/VERSION 

name中VERSION 文件内容:

#Tue Jul 07 17:47:26 CST 2020
namespaceID=985851890
clusterID=CID-555adbb2-ea3a-46a5-b754-d790d4fef8c1
cTime=0
storageType=NAME_NODE
blockpoolID=BP-538205956-192.168.197.120-1594115246246
layoutVersion=-60

b.修改hadoop2、hadoop3、hadoop4上hadoop的data中的VERSION 文件,把clusterID替换为已复制clusterID

vi /opt/soft/hadoop260/data/tmp/dfs/data/current/VERSION 

c.修改hadoop3上hadoop的name中的VERSION文件,把clusterID替换为已复制clusterID

vi /opt/soft/hadoop260/data/tmp/dfs/name/current/VERSION 

hadoop2:
在这里插入图片描述hadoop3:
在这里插入图片描述
hadoop4:
在这里插入图片描述
7.在[nn1]上,启动所有 datanode

sbin/hadoop-daemons.sh start datanode

8.启动 Zookeeper 集群

zkServer.sh start

9.将[nn1]切换为 Active

bin/hdfs haadmin -transitionToActive nn1 

10.查看是否 Active

bin/hdfs haadmin -getServiceState nn1

zookeeper 自动选举

1.关闭所有 HDFS服务:

sbin/stop-dfs.sh 

2.启动 Zookeeper 集群:

//三台各自启动
bin/zkServer.sh start 

3.初始化 HA 在 Zookeeper 中状态:

bin/hdfs zkfc -formatZK 

4.启动 yarn nodemanager 和resourcemanager
在 hadoop2 中执行:

//集群nodemanager启动
 sbin/start-yarn.sh 

在这里插入图片描述
在 hadoop3 中执行:

//hadoop3上resourcemanager启动
sbin/yarn-daemon.sh start resourcemanager

查看服务状态:

bin/yarn rmadmin -getServiceState [rm1|rm2]

在这里插入图片描述
5.[nn1]启动 HDFS 服务:

sbin/start-dfs.sh 

执行顺序如下:在这里插入图片描述两个namenode网页刷新,hadoop2 active状态 hadoop3 standby
在这里插入图片描述
在这里插入图片描述

6.在各个 NameNode 节点上启动 DFSZK Failover Controller,先在哪台机器 启动,哪个机器的 NameNode 就是 Active NameNode

sbin/hadoop-daemon.sh start zkfc

注意:这里是hadoop-daemon.sh start zkfc 不是hadoop-daemons.sh ,没有s,否则报错如下:

报错: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.

将hadoop2和hadoop3上DFSZKFailoverController停止

sbin/hadoop-daemon.sh stop zkfc

此时DFSZKFailoverController进程已经停止,然后先在hadoop3上启动DFSZKFailoverController服务,再在haoop2上启动服务DFSZKFailoverController,观察Active NameNode 和Standby NameNode。

3.验证

将 Active NameNode 机器断开网络

# service network stop

hadoop3已断开,hadoop2选举为leader,称为Active NameNode
在这里插入图片描述这一步需要在VM 后台或系统操作台上执行,网络断开后xshell已经连接不上了。
执行如下命令重启网络连接。

service network start

在这里插入图片描述

此时xshell可以连接机器。恢复hadoop3网络,重启namenode。

sbin/start-ll.sh
zkServer.sh start

刷新hadoop3 namenode网页,其作为Standby。
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值