Hadoop HA(高可用搭建)

上次记录了hadoop完全分布式搭建(非高可用),这次来学习hadoop HA 搭建。

一、原理机制

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

  1. 启动zookeeper集群

    zkServer.sh start
  2. 启动jurnalnode集群

    hadoop-daemon.sh start journalnode
    或者 hdfs --daemon start journalnode
  3. 启动第一台namenode

    hdfs namenode -format
    hadoop-deamon.sh start namenode
    或者 hdfs --daemon start namenode
  4. 剩余namenode启动做备

    hdfs namenode  -bootstrapStandby
  5. 启动datanode等节点

    start-dfs.sh
  6. 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
上一篇:4 ,node02 克隆安装 ( 五分钟搞定 )


下一篇:【Kubernetes学习之二】Kubernetes集群安装