Hadoop高可用(HA)集群搭建_hadoop高可用原理

一.准备环境

1.服务器准备(centos7)

10.1.198.133

hadoop

namenode


10.1.198.152

hadoop

namenode


10.1.198.155

hadoop



2.建立主机名和ip的映射

在每台机器上执行命令:Vim /etc/hosts

添加以下内容,hosts名称自定义:

10.1.198.152 host-10-1-198-152

10.1.198.155 host-10-1-198-155

10.1.198.133 host-10-1-198-133

3.创建用户

用root用户创建一个hadoop用户,用户名必须为hadoop。具体命令:

1)、 su # 上述提到的以 root 用户登录

2)、useradd -m hadoop -s /bin/bash # 创建新用户hadoop

3)、passwd hadoop 设置密码

4)、id hadoop 查看所在的用户组

5)、usermod -a -G groupname username 可以给用户增加用户组,分配权限(root,users)

4.配置ssh免密登录(需要使用部署集群的用户,这里拿hadoop举例)

在root用户下输入ssh-keygen -t rsa 一路回车

[hadoop@localhost ~]# ssh-keygen -t rsa

Generating public/private rsa key pair.

Enter file in which to save the key (/root/.ssh/id_rsa):

Created directory '/root/.ssh'.

Enter passphrase (empty for no passphrase):

Enter same passphrase again:

Your identification has been saved in /root/.ssh/id_rsa.

Your public key has been saved in /root/.ssh/id_rsa.pub.

The key fingerprint is:

SHA256:3YqkQYeytjQSc0nahgxEoxOYYBtTGddGglUZZxtODoY root@localhost.localdomain

The key's randomart image is:

+---[RSA 2048]----+

|OO.o*+=*o= |

|=+=B.Eo=B o |

|o.* * + .+ |

| . = + . . . |

| . = . S . . |

| + o + . . |

| . . . . |

| |

| |

+----[SHA256]-----+

秘钥生成后在~/.ssh/目录下,有两个文件id_rsa(私钥)和id_rsa.pub(公钥),将公钥复制到authorized_keys并赋予authorized_keys600权限

[hadoop@localhost .ssh]$ cp id_rsa.pub authorized_keys

[hadoop@localhost .ssh]# chmod 600 authorized_keys

同理在另外两台节点上进行相同的操作,然后将公钥复制到155节点上的authoized_keys

将133节点上的authoized_keys远程传输到152和155的~/.ssh/目录下

[hadoop@localhost .ssh]# scp authorized_keys hadoop@host-10-1-198-155:/home/hadoop/.ssh

[hadoop@localhost .ssh]# scp authorized_keys hadoop@host-10-1-198-152:/home/hadoop/.ssh

5.关闭防火墙

CentOS 7+查看防火墙状态命令

命令:systemctl status firewalld 执行上述命令,即可查看当前防火墙的状态。 如果防火墙的状态参数Active是active (running),则防火墙为开启状态。如果防火墙的状态参数是inactive (dead),则防火墙为关闭状态。 实例:

[root@linuxbaike ~]# systemctl status firewalld
● firewalld.service - firewalld - dynamic firewall daemon
   Loaded: loaded (/usr/lib/systemd/system/firewalld.service; disabled; vendor preset: enabled)
   Active: inactive (dead)
   Docs: man:firewalld(1)

上述例子中防火墙Active为inactive (dead),所以防火墙处于关闭状态。

开启或关闭防火墙命令

  • 开启命令:systemctl start firewalld
  • 临时关闭命令:systemctl stop firewalld
  • 永久关闭命令:systemctl disable firewalld

二.安装jdk

  1. 将下载好的jdk上传到服务器安装目录,解压
tar -zxvf 压缩文件 目标文件夹
mv 解压后文件名 jdk1.8(重命名,可以不做)
修改所属用户用户组 chown -R hadoop:hadoop /home/hadoop/jdk8/
  1. 配置环境变量

系统级别的环境变量配置文件为/etc/profile

普通用户的环境变量配置文件为/home/用户名/.bashrc或者/home/用户名/.bash_profile

我是用hadoop用户安装的JDK,所以修改/home/hadoop/.bashrc文件,添加JDK的环境变量:

vim /home/hadoop/.bashrc

#### hadoop #### JAVA_HOME=/home/hadoop/jdk8 JRE_HOME=/home/hadoop/jdk8/jre CLASS_PATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar:$JRE_HOME/lib PATH=$PATH:$JAVA_HOME/bin:$JRE_HOME/bin export JAVA_HOME JRE_HOME CLASS_PATH PATH

  1. 立即生效
source /home/hadoop/.bashrc

java -version 查看jdk版本
  1. 将jdk远程scp 到另外两台机器

[hadoop@localhost .ssh]# scp -r jdk8/ hadoop@host-10-1-198-152:/home/hadoop/

[hadoop@localhost .ssh]# scp -r jdk8/ hadoop@host-10-1-198-155:/home/hadoop/

配置jdk环境变量同上

三.安装zookeeper集群

详见zookeeper集群安装:zookeeper集群安装

四.hadoop HA集群安装

1.原理概述

(1) 为什么会有HadoopHA机制?

HA:High Available,高可用 在Hadoop 2.0之前,在HDFS集群中NameNode存在单点故障 (SPOF:A Single Point of Failure) 对于只有一个NameNode的集群,如果NameNode机器出现故障(比如宕机或是软件、硬件升级),那么整个集群将无法使用,直到NameNode重新启动

(2) 如何解决?

HDFS的HA功能通过配置Active/Standby两个NameNode 实现在集群中对NameNode的热备来解决上述问题。

如果出现故障,如机器崩溃或机器需要升级维护,这时可通过此种方式将NameNode很快的切换到另外一台机器。

在一个典型的HDFS(HA)集群中,使用多台单独的机器配置为 NameNode,在任何时间点,确保多个NameNode中只有一个处于 Active状态,其他的处在Standby状态。

其中ActiveNameNode负责集群中的所有客户端操作,StandbyNameNode仅仅充当备机,保证一旦ActiveNameNode出现问题能够快速切换。

为了能够实时同步Active和Standby两个NameNode的元数据信息(editlog),需提供一个共享存储系统,可以是NFS、QJM(Quorum Journal Manager)或者Zookeeper,ActiveNamenode将数据写入共享存储系统,而Standby监听该系统,一旦发现有新数据写入,则读取这些数据,并加载到自己内存中,以保证自己内存状态与 ActiveNameNode保持基本一致,如此这般,在紧急情况下 standby便可快速切为 activenamenode。

为了实现快速切换,Standby节点获取集群的最新文件块信息也是很有必要的。为了实现这一目标,DataNode需要配置所有NameNode的位置,并同时给他们发送文件块信息以及心跳检测。

2.下载hadoop包

官网下载比较慢,我这里选择清华大学开源软件镜像站:清华大学开源软件镜像站 | Tsinghua Open Source
Mirrorcubequestion-circlegithubbullhornangle-double-rightlinkfile-archiveenvelopeexternal-link-altcompact-discenvelopehashtagweibo

3. 安装步骤

(1) 把hadoop安装包上传到服务器并解压

tar zxvf hadoop-3.2.4.tar.gz

(2) 修改 hadoop-env.sh、mapred-env.sh、yarn-env.sh 这三个配置文件,添加JAVA_HOME

hadoop的配置文件在HADOOP_HOME/etc/hadoop/下

export JAVA_HOME=/home/hadoop/jdk8

(3) 修改 core-site.xml


    
    
    fs.defaultFS
    hdfs://ns1/
    
    
    
    
        hadoop.tmp.dir
        /home/hadoop/hadoopdata/
    

    
    
        ha.zookeeper.quorum
        host-10-1-198-133:2181,host-10-1-198-152:2181,host-10-1-198-155:2181
    

(4) 修改 hdfs-site.xml


    
    
    
        dfs.replication
        2
    

    
    
        dfs.nameservices
        ns1
    

    
    
        dfs.ha.namenodes.ns1
        nn1,nn2
    

    
    
        dfs.namenode.rpc-address.ns1.nn1
        host-10-1-198-133:9000
    
    
    
        dfs.namenode.http-address.ns1.nn1
        host-10-1-198-133:50070
    
    
    
        dfs.namenode.rpc-address.ns1.nn2
        host-10-1-198-152:9000
    
    
    
        dfs.namenode.http-address.ns1.nn2
        host-10-1-198-152:50070
    

    
    
        dfs.namenode.shared.edits.dir
        qjournal://host-10-1-198-133:8485;host-10-1-198-152:8485;host-10-1-198-155:8485/ns1
    

    
    
        dfs.journalnode.edits.dir
        /home/hadoop/journaldata
    

    
    
        dfs.ha.automatic-failover.enabled
        true
    

    
    
    
        dfs.client.failover.proxy.provider.ns1
        org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider
    

    
    
        dfs.ha.fencing.methods
        
            sshfence
            shell(/bin/true)
        
    

    
    
        dfs.ha.fencing.ssh.private-key-files
        /home/hadoop/.ssh/id_rsa
    
    
    
    
        dfs.ha.fencing.ssh.connect-timeout
        30000
    
    

(5) 修改 mapred-site.xml

集群中只有mapred-site.xml.template,可以从这个文件进行复制

cp mapred-site.xml.template mapred-site.xml

    
    
        mapreduce.framework.name
        yarn
    

    
    
        mapreduce.jobhistory.address
        host-10-1-198-133:10020
    

    
    
        mapreduce.jobhistory.webapp.address
        host-10-1-198-133:19888
    
    


(6) 修改 yarn-site.xml


    
    
        yarn.resourcemanager.ha.enabled
        true
    

    
    
        yarn.resourcemanager.cluster-id
        jyarn
    

    
    
        yarn.resourcemanager.ha.rm-ids
        rm1,rm2
    

    
    
        yarn.resourcemanager.hostname.rm1
        host-10-1-198-133
    

    
        yarn.resourcemanager.hostname.rm2
        host-10-1-198-152
    

    
    
        yarn.resourcemanager.zk-address
        host-10-1-198-133:2181,host-10-1-198-152:2181,host-10-1-198-155:2181
    

    
    
        yarn.nodemanager.aux-services
        mapreduce_shuffle
    

    
    
        yarn.log-aggregation-enable
        true
    

    
    
        yarn.log-aggregation.retain-seconds
        
        86400
    

    
    
        yarn.resourcemanager.recovery.enabled
    true
    

    
    
        yarn.resourcemanager.store.class
        org.apache.hadoop.yarn.server.resourcemanager.recovery.ZKRMStateStore
    
    


(7) 修改 slaves 配置文件,指定DataNode所在的节点

hadoop3.0以后slaves更名为workers

vim workers

host-10-1-198-133
host-10-1-198-152
host-10-1-198-155


(8) 把hadoop安装包分发给其他节点

[hadoop@localhost ~]$ scp -r /home/hadoop/hadoop-3.2.4 host-10-1-198-152:/home/hadoop/

[hadoop@localhost ~]$ scp -r /home/hadoop/hadoop-3.2.4 host-10-1-198-155:/home/hadoop/

(9) 给每个节点配置HADOOP_HOME环境变量

vim ~/.bash_profile 
或者 
[hadoop@localhost ~]$ vim ~/.bashrc 


export HADOOP_HOME=/home/hadoop/hadoop-3.2.4
export PATH=$PATH:$HADOOP_HOME/bin:$HADOOP_HOME/sbin

source /home/hadoop/.bashrc

(10) 启动zookeeper集群

保证zookeeper集群正常启动

zkServer.sh start

# 检查zookeeper集群是否正常
./zkServer.sh status

(11) 分别在每个journalnode节点上启动journalnode进程

[hadoop@localhost ~]$  hadoop-daemon.sh start journalnode
[hadoop@localhost ~]$  hadoop-daemon.sh start journalnode
[hadoop@localhost ~]$  hadoop-daemon.sh start journalnode


使用jps命令确认这3个节点上的JournalNode进程都启动

(12) 在第一个namenode节点(node01)上格式化文件系统

[hadoop@localhost ~]$  hadoop namenode -format


看到以下信息说明格式化成功:

(13) 同步两个namenode的元数据

查看你配置的hadoop.tmp.dir这个配置信息,得到hadoop工作的目录,我的是/home/hadoop/hadoopdata/,把hadoop01上的hadoopdata目录发送给hadoop02的相同路径下,这一步是为了同步两个namenode的元数据

[hadoop@localhost ~]$ scp -r /home/hadoop/hadoopdata host-10-1-198-152:/home/hadoop/


也可以在host-10-1-198-152执行以下命令:

[hadoop@localhost ~]$ hadoop namenode -bootstrapStandby


(14) 格式化ZKFC(任选一个namenode节点格式化)

[hadoop@localhost ~]$ hdfs zkfc -formatZK


看到如下信息说明ZKFC格式化成功

;

(15) 启动hdfs

[hadoop@localhost bin]$ start-dfs.sh


(16) 启动yarn

[hadoop@localhost bin]$ start-yarn.sh


(17) 启动 mapreduce 任务历史服务器

[hadoop@localhost bin]$ mr-jobhistory-daemon.sh start historyserver


3. 验证集群是否搭建成功

(1) 查看进程是否全部启动

根据集群的规划查看是否每个节点对应的进程都启动了

[hadoop@localhost bin]$ jps
13075 ResourceManager
13621 QuorumPeerMain
13349 NodeManager
19621 Jps
18888 JobHistoryServer
10121 DFSZKFailoverController
10043 JournalNode
9164 NameNode
9373 DataNode

[hadoop@localhost ~]$ jps
1569 QuorumPeerMain
4194 NodeManager
31829 NameNode
3977 ResourceManager
32650 DFSZKFailoverController
32107 DataNode
14507 Jps
3310 JournalNode

[hadoop@localhost ~]$ jps
17559 QuorumPeerMain
713 NodeManager
29130 DataNode
24095 JournalNode
13423 Jps


(2) 查看HDFS状态

这里只展示部分

[hadoop@localhost bin]$ hdfs dfsadmin -report

-------------------------------------------------
Live datanodes (3):

Name: 10.1.198.133:9866 (host-10-1-198-133)
Hostname: localhost
Decommission Status : Normal
Configured Capacity: 510776086528 (475.70 GB)
DFS Used: 4096 (4 KB)
Non DFS Used: 12305268736 (11.46 GB)


(3) 查看各节点的主备状态

[hadoop@localhost bin]$ hdfs haadmin -getServiceState nn1
active
[hadoop@localhost bin]$ hdfs haadmin -getServiceState nn2
standby
[hadoop@localhost bin]$ yarn rmadmin -getServiceState rm1
active
[hadoop@localhost bin]$ yarn rmadmin -getServiceState rm2
standby
[hadoop@localhost bin]$ 


(4) 访问WEB页面

  • 访问namenode
  • 访问resourcemanager,当访问到resourcemanager的备节点,会自动切换到主节点

;

  • 访问历史记录服务器

;

(5) 验证集群的功能是否正常

# 上传一个文件
[hadoop@localhost bin]$ hdfs dfs -put /home/hadoop/TAG_TABLE_liedanyinfenhao.csv /
# 上传成功
[hadoop@localhost bin]$ hdfs dfs -ls /
Found 2 items
-rw-r--r--   2 hadoop supergroup        790 2022-11-11 23:11 /TAG_TABLE_liedanyinfenhao.csv
drwxrwx---   - hadoop supergroup          0 2022-11-11 22:57 /tmp

# 执行一个mapreduce例子程序
[hadoop@localhost mapreduce]$ pwd
/home/hadoop/hadoop-3.2.4/share/hadoop/mapreduce
[hadoop@localhost mapreduce]$ hadoop jar hadoop-mapreduce-examples-3.2.4.jar  pi 5 5
Number of Maps  = 5
Samples per Map = 5
Wrote input for Map #0
Wrote input for Map #1
Wrote input for Map #2
Wrote input for Map #3
Wrote input for Map #4
.
.
.
.
.
# 执行成功,打印的记录最后一行有pi的结果
......
Estimated value of Pi is 3.68000000000000000000


(6) 验证集群高可用

# 杀死ActiveNameNode进程
[hadoop@hadoop02 ~]$ jps
......5804 NameNode

[hadoop@hadoop02 ~]$ kill -9 5804

这时在访问152切换为ActiveNameNode;

重新启动133的namenode

[hadoop@localhost ~]$ hadoop-daemon.sh start namenode


152的namenode并不会切换成ActiveNameNode,而是成为StandbyNamenode;

到此,Hadoop HA集群搭建成功!

4. HadoopHA集群的重装

  1. 删除所有节点中hadoop的工作目录(core-site.xml中配置的hadoop.tmp.dir那个目录)
  2. 如果你在core-site.xml中还配置了dfs.datanode.data.dirdfs.datanode.name.dir这两个配置,那么把这两个配置对应的目录也删除
  3. 删除所有节点中hadoop的log日志文件,默认在HADOOP_HOME/logs目录下
  4. 删除zookeeper集群中所关于hadoop的znode节点

图中的红色框中的znode节点是与hadoop集群有关的,但rmstore这个节点不能删除,会报以下错误

Authentication is not valid : /rmstore/ZKRMStateRoot/RMVersionNode

所以删除另外两个就可以,重新格式化ZKFC的时候会询问是否覆盖rmstore这个节点,输入yes即可

  1. 删除所有节点中的journaldata,路径是在hdfs-site.xml 中的dfs.journalnode.edits.dir中配置的
  2. 按照上面安装集群的步骤重新安装即可