上次记录了hadoop完全分布式搭建(非高可用),这次来学习hadoop HA 搭建。
一、原理机制
主备NameNode
解决单点故障(属性,位置)
- 主NameNode对外提供服务,备NameNode同步主NameNode元数据,以待切换
- 所有DataNode同时向两个NameNode汇报数据块信息(位置)
- JNN:集群(属性)
- standby:备,完成了edits.log文件的合并产生新的image,推送回ANN
两种切换选择
- 手动切换:通过命令实现主备之间的切换,可以用HDFS升级等场合
- 自动切换:基于Zookeeper实现
基于Zookeeper自动切换方案
- ZooKeeper Failover Controller:监控NameNode健康状态,
- 并向Zookeeper注册NameNode
- NameNode挂掉后,ZKFC为NameNode竞争锁,获得ZKFC 锁的NameNode变为active
二、步骤
集群规划
NN-1 | NN-2 | DN | ZK | ZKFC | JNN | |
---|---|---|---|---|---|---|
node01 | * | * | * | |||
node02 | * | * | * | * | * | |
node03 | * | * | * | |||
node04 | * | * |
1.修改hadoop.ev.sh文件
(hadoop3.x中要求指定用户进程)
export HDFS_ZKFC_USER=root
export HDFS_JOURNALNODE_USER=root
2.配置hdfs-site.xml
(这里配置有点多,查看官方文档介绍:hadoop-3.2.0 doc HDFSHighAvailabilityWithQJM )
dfs.nameservices - the logical name for this new nameservice
(名称服务,只是一个逻辑名称逻辑名称)
<!--为这个nameservice选择一个逻辑名称,例如“mycluster”,并为这个配置选项的值使用这个逻辑名称。您选择的名称是任意的。它将用于配置并作为集群中绝对HDFS路径的权威组件。-->
<property>
<name>dfs.nameservices</name>
<value>mycluster</value>
</property>
dfs.ha.namenodes.[nameservice ID] - unique identifiers for each NameNode in the nameservice
(名称服务中每个NameNode的惟一标识符)
<!--使用逗号分隔的NameNode id列表进行配置。datanode将使用它来确定集群中的所有namenode。例如,本文使用“mycluster”作为nameservice ID,并且我们集群规划使用“node01”、“node02”作为namenode的单独ID,可以这样配置:-->
<property>
<name>dfs.ha.namenodes.mycluster</name>
<value>node01,node02</value>
</property>
<!--官网建议:HA的最小namenode数量是两个,但是您可以配置更多。由于通信开销,建议不超过5个(建议使用3个namenode)-->
dfs.namenode.rpc-address.[nameservice ID].[name node ID] - the fully-qualified RPC address for each NameNode to listen on
(namenode的rpc服务器的监听地址)
<property>
<name>dfs.namenode.rpc-address.mycluster.node01</name>
<value>node01:8020</value>
</property>
<property>
<name>dfs.namenode.rpc-address.mycluster.node02</name>
<value>node02:8020</value>
</property>
dfs.namenode.http-address.[nameservice ID].[name node ID] - the fully-qualified HTTP address for each NameNode to listen on
(namenode的HTTP服务器的监听地址,与rpc同理只不过端口变为9870)
<property>
<name>dfs.namenode.http-address.mycluster.node01</name>
<value>node01:9870</value>
</property>
<property>
<name>dfs.namenode.http-address.mycluster.node02</name>
<value>node02:9870</value>
</property>
dfs.namenode.shared.edits.dir - the URI which identifies the group of JNs where the NameNodes will write/read edits
(配置JournalNodes 集群的URI)
<!--这是配置提供共享编辑存储的journalnode地址的地方,这些地址由活动nameNode写入,由备用nameNode读取,以便与活动nameNode所做的所有文件系统更改保持最新。虽然必须指定几个JournalNode地址,但是应该只配置其中一个uri。URI的形式应该是:qjournal://*host1:port1*;*host2:port2*;*host3:port3*/*journalId*。日志ID是这个名称服务的惟一标识符,它允许一组日志节点为多个联合名称系统提供存储-->
<property>
<name>dfs.namenode.shared.edits.dir</name>
<value>qjournal://node01:8485;node02:8485;node03:8485/mycluster</value>
</property>
dfs.client.failover.proxy.provider.[nameservice ID] - the Java class that HDFS clients use to contact the Active NameNode
(配置故障转移代理类)
<property>
<name>dfs.client.failover.proxy.provider.mycluster</name>
<value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value>
</property>
dfs.ha.fencing.methods - a list of scripts or Java classes which will be used to fence the Active NameNode during a failover
(隔离方法;确保当前时间点只有一个namenode处于active状态,jurnalnode只允许1个namenode来读写数据,但是也会出现意外的情况,因此需要控制对方机器,进行将自我提升[active],将对方降级[standby])
<property>
<name>dfs.ha.fencing.methods</name>
<value>sshfence</value>
</property>
<property>
<name>dfs.ha.fencing.ssh.private-key-files</name>
<value>/root/.ssh/id_rsa</value>
</property>
dfs.journalnode.edits.dir - the path where the JournalNode daemon will store its local state
(journalnode日志存放路径)
<property>
<name>dfs.journalnode.edits.dir</name>
<value>/opt/tmp/hadoop/journalnode/data</value>
</property>
3.core-site.xml
(注意更改下 hadoop.tmp.dir
的路径,与node的名称【类似一个域名多ip】)
<configuration>
<property>
<name>fs.defaultFS</name>
<value>hdfs://mycluster</value>
</property>
<property>
<name>hadoop.tmp.dir</name>
<value>/opt/tmp/hadoop/ha</value>
</property>
</configuration>
4.自动故障转移配置【zk】
再次回到hdfs-site.xml文件与core-site.xml配置中:
打开自动故障转移:
The configuration of automatic failover requires the addition of two new parameters to your configuration. In your hdfs-site.xml
file, add:
<property>
<name>dfs.ha.automatic-failover.enabled</name>
<value>true</value>
</property>
添加zookeeper的地址:
This specifies that the cluster should be set up for automatic failover. In your core-site.xml
file, add:
<property>
<name>ha.zookeeper.quorum</name>
<value>node02:2181,node03:2181,node04:2181</value>
</property>
5.分发配置到其他节点
注意workes也要配置
scp -r hadoop-env.sh core-site.xml hdfs-site.xml node04:`pwd`
6.安装Zookeeper及配置
安装:略
配置zoo.cfg:
dataDir=/opt/tmp/zookeeper
server.1=192.168.121.102:2888:3888
server.2=192.168.121.103:2888:3888
server.3=192.168.121.104:2888:3888
创建myid【1 2 3同理】:
mkdir /opt/tmp/zookeeper
echo 1 > /opt/tmp/zookeeper/myid
7.启动Hadoop HA
-
启动zookeeper集群
zkServer.sh start
-
启动jurnalnode集群
hadoop-daemon.sh start journalnode 或者 hdfs --daemon start journalnode
-
启动第一台namenode
hdfs namenode -format hadoop-deamon.sh start namenode 或者 hdfs --daemon start namenode
-
剩余namenode启动做备
hdfs namenode -bootstrapStandby
-
启动datanode等节点
start-dfs.sh
-
Initializing HA state in ZooKeeper(在ZooKeeper中初始化HA状态)
hdfs zkfc -formatZK
三、测试
访问node01:9870: Overview 'node02:8020' (active)
访问node02:9870: Overview 'node02:8020' (standby)
1.namenode挂掉的情况
hadoop-daemon.sh stop namenode 或者
hdfs --daemon stop namenode
2.ZKFC挂掉的情况
hadoop-daemon.sh stop zkfc 或者
hdfs --daemon stop zkfc