前言

传统的Hadoop集群从,由于只存在一个NameNode,一旦这个唯一的NameNode发生故障,就会导致整个集群变得不可用,也就是常说的“单点故障问题”,虽然存在Secondary NameNode,但是Secondary NameNode并不是NameNode的备用节点。在HDFS HA中,通过配置多个 NameNodes(Active/Standby)实现在集群中对 NameNode 的热备来解决上述问题。如果出现故障,如机器崩溃或机器需要升级维护,这时可通过此种方式将 NameNode 很快的切换到另外一台机器。

一、HA概述:

所谓 HA(High Availablity),即高可用(7*24 小时不中断服务)。实现高可用最关键的策略是消除单点故障。HA 严格来说应该分成各个组件的 HA 机制:HDFS 的 HA 和 YARN 的 HA。NameNode 主要在以下两个方面影响 HDFS 集群 ➢ NameNode 机器发生意外,如宕机,集群将无法使用,直到管理员重启 ➢ NameNode 机器需要升级,包括软件、硬件升级,此时集群也将无法使用

二、HDFS-HA 核心问题

怎么保证三台 namenode 的数据一致: a. Fsimage:让一台 nn 生成数据,让其他机器 nn 同步 b. Edits:需要引进新的模块 JournalNode 来保证 edtis 的文件的数据一致性怎么让同时只有一台 nn 是 active,其他所有是 standby 的:手动或自动分配2nn 在 ha 架构中并不存在,定期合并 fsimage 和 edtis 的活谁来干:由 standby 的 nn 来干如果 nn 真的发生了问题,怎么让其他的 nn 上位干活:手动或自动故障转移

三、HDFS HA 集群搭建

当前HDFS集群规划

hadoop102hadoop103hadoop104NameNodeSecondary NameNodeDataNodeDataNodeDataNode

HA 的主要目的是消除 namenode 的单点故障,需要将 HDFS 集群规划成以下模样

hadoop102hadoop103hadoop104NameNodeNameNodeNameNodeDataNodeDataNodeDataNode

HDFS-HA 手动模式

环境准备:

修改IP修改主机名及主机名和IP地址映射关闭防火墙ssh免密登录安装JDK,配置环境变量

规划集群

hadoop102hadoop103hadoop104NameNodeNameNodeNameNodeDataNodeDataNodeDataNodeJournalNodeJournalNodeJournalNode

配置HDFS-HA集群

1. 在 opt 目录下创建一个hadoopHA文件夹

[leon@hadoop102 ~]$ cd /opt

[leon@hadoop102 opt]$ sudo mkdir hadoopHA

[leon@hadoop102 opt]$ sudo chown leon:leon /opt/hadoopHA # 这里给用户赋权限

2. 将/opt/module/下的 hadoop-3.1.3 拷贝到/opt/hadoopHA 目录下,并删除data和log目录

[leon@hadoop102 opt]$ cp -r /opt/module/hadoop-3.1.3 /opt/hadoopHA/

3. 配置core-site.xml

fs.defaultFS

hdfs://mycluster

hadoop.tmp.dir

/opt/HadoopHA/hadoop-3.1.3/data

4. 配置hdfs-site.xml(注意:在最后ssh部分将用户名改成自己的)

dfs.namenode.name.dir

file://${hadoop.tmp.dir}/name

dfs.datanode.data.dir

file://${hadoop.tmp.dir}/data

dfs.journalnode.edits.dir

${hadoop.tmp.dir}/jn

dfs.nameservices

mycluster

dfs.ha.namenodes.mycluster

nn1,nn2,nn3

dfs.namenode.rpc-address.mycluster.nn1

hadoop102:8020

dfs.namenode.rpc-address.mycluster.nn2

hadoop103:8020

dfs.namenode.rpc-address.mycluster.nn3

hadoop104:8020

dfs.namenode.http-address.mycluster.nn1

hadoop102:9870

dfs.namenode.http-address.mycluster.nn2

hadoop103:9870

dfs.namenode.http-address.mycluster.nn3

hadoop104:9870

dfs.namenode.shared.edits.dir

qjournal://hadoop102:8485;hadoop103:8485;hadoop104:8485/mycluster

dfs.client.failover.proxy.provider.mycluster

org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider

dfs.ha.fencing.methods

sshfence

dfs.ha.fencing.ssh.private-key-files

/home/leon/.ssh/id_rsa

分发到其他节点

[leon@hadoop102 opt]$ xsync hadoopHA

启动 HDFS-HA 集群

将 HADOOP_HOME 环境变量更改到 HA 目录(三台机器)

[leon@hadoop102 ~]$ sudo vim /etc/profile.d/my_env.sh

将 HADOOP_HOME 部分改为如下

#HADOOP_HOME

export HADOOP_HOME=/opt/ha/hadoop-3.1.3

export PATH=$PATH:$HADOOP_HOME/bin

export PATH=$PATH:$HADOOP_HOME/sbin

在三台机器上source一下

[leon@hadoop102 ~]$source /etc/profile

在各个 JournalNode 节点上,输入以下命令启动 journalnode 服务

[leon@hadoop102 ~]$ hdfs --daemon start journalnode

[leon@hadoop103 ~]$ hdfs --daemon start journalnode

[leon@hadoop104 ~]$ hdfs --daemon start journalnode

在[nn1]上,对其进行格式化,并启动

[leon@hadoop102 ~]$ hdfs namenode -format

[leon@hadoop102 ~]$ hdfs --daemon start namenode

在[nn2]和[nn3]上,同步 nn1 的元数据信息

[leon@hadoop103 ~]$ hdfs namenode -bootstrapStandby

[leon@hadoop104 ~]$ hdfs namenode -bootstrapStandby

启动[nn2]和[nn3]

[leon@hadoop103 ~]$ hdfs --daemon start namenode

[leon@hadoop104 ~]$ hdfs --daemon start namenode

查看web页面显示

在所有节点上,启动 datanode

[leon@hadoop102 ~]$ hdfs --daemon start datanode

[leon@hadoop103 ~]$ hdfs --daemon start datanode

[leon@hadoop104 ~]$ hdfs --daemon start datanode

将[nn1]切换为 Active

[leon@hadoop102 ~]$ hdfs haadmin -transitionToActive nn1

11.查看是否Active

[leon@hadoop102 ~]$ hdfs haadmin -getServiceState nn1

HDFS-HA 自动模式

集群规划

hadoop102hadoop103hadoop104NameNodeNameNodeNameNodeDataNodeDataNodeDataNodeJournalNodeJournalNodeJournalNodeZookeeperZookeeperZookeeperZKFCZKFCZKFC

修改配置文件

在 hdfs-site.xml 中增加

dfs.ha.automatic-failover.enabled

true

在 core-site.xml 文件中增加

ha.zookeeper.quorum

hadoop102:2181,hadoop103:2181,hadoop104:2181

修改后分发配置文件

[leon@hadoop102 etc]$ xsync hadoop/ # 在/opt/ha/hadoop-3.1.3/etc目录下

启动

关闭所有 HDFS 服务:

[leon@hadoop102 ~]$ stop-dfs.sh

启动 Zookeeper 集群(ZK集群的安装部署可以看这篇):

[leon@hadoop102 ~]$ zkServer.sh start

[leon@hadoop103 ~]$ zkServer.sh start

[leon@hadoop104 ~]$ zkServer.sh start

启动 Zookeeper 以后,然后再初始化 HA 在 Zookeeper 中状态:

[leon@hadoop102 ~]$ hdfs zkfc -formatZK

启动 HDFS 服务

[leon@hadoop102 ~]$ start-dfs.sh

YARN-HA 配置(这个是在上述zk的基础上进行的)

修改配置文件:

yarn-site.xml

yarn.nodemanager.aux-services

mapreduce_shuffle

yarn.resourcemanager.ha.enabled

true

yarn.resourcemanager.cluster-id

cluster-yarn1

yarn.resourcemanager.ha.rm-ids

rm1,rm2,rm3

yarn.resourcemanager.hostname.rm1

hadoop102

yarn.resourcemanager.webapp.address.rm1

hadoop102:8088

yarn.resourcemanager.address.rm1

hadoop102:8032

yarn.resourcemanager.scheduler.address.rm1

hadoop102:8030

yarn.resourcemanager.resource-tracker.address.rm1

hadoop102:8031

yarn.resourcemanager.hostname.rm2

hadoop103

yarn.resourcemanager.webapp.address.rm2

hadoop103:8088

yarn.resourcemanager.address.rm2

hadoop103:8032

yarn.resourcemanager.scheduler.address.rm2

hadoop103:8030

yarn.resourcemanager.resource-tracker.address.rm2

hadoop103:8031

yarn.resourcemanager.hostname.rm3

hadoop104

yarn.resourcemanager.webapp.address.rm3

hadoop104:8088

yarn.resourcemanager.address.rm3

hadoop104:8032

yarn.resourcemanager.scheduler.address.rm3

hadoop104:8030

yarn.resourcemanager.resource-tracker.address.rm3

hadoop104:8031

yarn.resourcemanager.zk-address

hadoop102:2181,hadoop103:2181,hadoop104:2181

yarn.resourcemanager.recovery.enabled

true

yarn.resourcemanager.store.class

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

yarn.nodemanager.env-whitelist

JAVA_HOME,HADOOP_COMMON_HOME,HADOOP_HDFS_HOME,HADOOP_CONF_DIR,CLASSPATH_PREPEND_DISTCACHE,HADOOP_YARN_HOME,HADOOP_MAPRED_HOME

分发yarn-site.xml启动YARN

[leon@hadoop102 ~]$ start-yarn.sh # 在 hadoop102或者hadoop103中启动

查看服务状态

[leon@hadoop102 ~]$ yarn rmadmin -getServiceState rm1

web 端查看 hadoop102:8088 和 hadoop103:8088 的 YARN 的状态

HA集群最终配置

hadoop102hadoop103hadoop104NameNodeNameNodeNameNodeDataNodeDataNodeDataNodeJournalNodeJournalNodeJournalNodeZookeeperZookeeperZookeeperZKFCZKFCZKFCResourceManagerResourceManagerResourceManagerNodeManagerNodeManagerNodeManager

总结

以上就是今天要讲的内容,本文仅仅简单介绍了Hadoop HA集群的安装配置,是在Hadoop集群的基础上搭建的。本人太懒了,HA都写好了,Hadoop安装与部署还没补上/(ㄒoㄒ)/~~,这个坑会在后续填上。如果这篇文章对你有帮助的话,可以动动手指一键三连(bushi),谢谢同志们

参考文章

评论可见,请评论后查看内容,谢谢!!!
 您阅读本篇文章共花了: