在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状态
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。