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

集群规划

机器名

hadoop2

hadoop3

hadoop4

namenode

nn1

nn2

resourcemanager

rm1

rm2

HDFS

NameNode DataNode Journalnode

NameNode DataNode Journalnode

DataNode Journalnode

YARN

NodeManager ResourceManager

NodeManager ResourceManager

NodeManager

前提:
完成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状态

hadoop 计算集群 hadoop集群如何使用_zookeeper

hadoop 计算集群 hadoop集群如何使用_zookeeper_02

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:

hadoop 计算集群 hadoop集群如何使用_hadoop_03

hadoop3:

hadoop 计算集群 hadoop集群如何使用_hadoop_04


hadoop4:

hadoop 计算集群 hadoop集群如何使用_hdfs_05


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

hadoop 计算集群 hadoop集群如何使用_hdfs_06


在 hadoop3 中执行:

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

查看服务状态:

bin/yarn rmadmin -getServiceState [rm1|rm2]

hadoop 计算集群 hadoop集群如何使用_hdfs_07


5.[nn1]启动 HDFS 服务:

sbin/start-dfs.sh

执行顺序如下:

hadoop 计算集群 hadoop集群如何使用_hadoop 计算集群_08

两个namenode网页刷新,hadoop2 active状态 hadoop3 standby

hadoop 计算集群 hadoop集群如何使用_hadoop_09


hadoop 计算集群 hadoop集群如何使用_hadoop 计算集群_10

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

hadoop 计算集群 hadoop集群如何使用_zookeeper_11

这一步需要在VM 后台或系统操作台上执行,网络断开后xshell已经连接不上了。

执行如下命令重启网络连接。

service network start

hadoop 计算集群 hadoop集群如何使用_zookeeper_12

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

sbin/start-ll.sh
zkServer.sh start

刷新hadoop3 namenode网页,其作为Standby。

hadoop 计算集群 hadoop集群如何使用_hadoop 计算集群_13