Hadoop HA 高可用集群搭建

前言

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

一、HA概述:

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

二、HDFS-HA 核心问题

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

三、HDFS HA 集群搭建

当前HDFS集群规划

hadoop102hadoop103hadoop104
NameNodeSecondary NameNode
DataNodeDataNodeDataNode

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

hadoop102hadoop103hadoop104
NameNodeNameNodeNameNode
DataNodeDataNodeDataNode
HDFS-HA 手动模式
环境准备:
  1. 修改IP
  2. 修改主机名及主机名和IP地址映射
  3. 关闭防火墙
  4. ssh免密登录
  5. 安装JDK,配置环境变量
规划集群
hadoop102hadoop103hadoop104
NameNodeNameNodeNameNode
DataNodeDataNodeDataNode
JournalNodeJournalNodeJournalNode
配置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

<configuration>
<!-- 把多个 NameNode 的地址组装成一个集群 mycluster -->
    <property>
        <name>fs.defaultFS</name>
        <value>hdfs://mycluster</value>
    </property>
<!-- 指定 hadoop 运行时产生文件的存储目录 -->
    <property>
        <name>hadoop.tmp.dir</name>
        <value>/opt/HadoopHA/hadoop-3.1.3/data</value>
    </property>
</configuration>

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

<configuration>
<!-- NameNode 数据存储目录 -->
    <property>
        <name>dfs.namenode.name.dir</name>
        <value>file://${hadoop.tmp.dir}/name</value>
    </property>

<!-- DataNode 数据存储目录 -->
    <property>
        <name>dfs.datanode.data.dir</name>
        <value>file://${hadoop.tmp.dir}/data</value>
    </property>
<!-- JournalNode 数据存储目录 -->
    <property>
        <name>dfs.journalnode.edits.dir</name>
        <value>${hadoop.tmp.dir}/jn</value>
    </property>

<!-- 完全分布式集群名称 -->
    <property>
        <name>dfs.nameservices</name>
        <value>mycluster</value>
    </property>

<!-- 集群中 NameNode 节点都有哪些 -->
    <property>
        <name>dfs.ha.namenodes.mycluster</name>
        <value>nn1,nn2,nn3</value>
    </property>
<!-- NameNode 的 RPC 通信地址 -->
    <property>
        <name>dfs.namenode.rpc-address.mycluster.nn1</name>
        <value>hadoop102:8020</value>
    </property>
    <property>
        <name>dfs.namenode.rpc-address.mycluster.nn2</name>
        <value>hadoop103:8020</value>
    </property>
    <property>
        <name>dfs.namenode.rpc-address.mycluster.nn3</name>
        <value>hadoop104:8020</value>
    </property>
<!-- NameNode 的 http 通信地址 -->
    <property>
        <name>dfs.namenode.http-address.mycluster.nn1</name>
        <value>hadoop102:9870</value>
    </property>
    <property>
        <name>dfs.namenode.http-address.mycluster.nn2</name>
        <value>hadoop103:9870</value>
    </property>
    <property>
        <name>dfs.namenode.http-address.mycluster.nn3</name>
        <value>hadoop104:9870</value>
    </property>

<!-- 指定 NameNode 元数据在 JournalNode 上的存放位置 -->
    <property>
        <name>dfs.namenode.shared.edits.dir</name>
        <value>qjournal://hadoop102:8485;hadoop103:8485;hadoop104:8485/mycluster</value>
    </property>

<!-- 访问代理类:client 用于确定哪个 NameNode 为 Active -->
    <property>
        <name>dfs.client.failover.proxy.provider.mycluster</name>
        <value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</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>/home/leon/.ssh/id_rsa</value>
    </property>
</configuration>
  1. 分发到其他节点
[leon@hadoop102 opt]$ xsync hadoopHA
启动 HDFS-HA 集群
  1. 将 HADOOP_HOME 环境变量更改到 HA 目录(三台机器)
[leon@hadoop102 ~]$ sudo vim /etc/profile.d/my_env.sh
  1. 将 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
  1. 在三台机器上source一下
[leon@hadoop102 ~]$source /etc/profile
  1. 在各个 JournalNode 节点上,输入以下命令启动 journalnode 服务
[leon@hadoop102 ~]$ hdfs --daemon start journalnode
[leon@hadoop103 ~]$ hdfs --daemon start journalnode
[leon@hadoop104 ~]$ hdfs --daemon start journalnode
  1. 在[nn1]上,对其进行格式化,并启动
[leon@hadoop102 ~]$ hdfs namenode -format
[leon@hadoop102 ~]$ hdfs --daemon start namenode
  1. 在[nn2]和[nn3]上,同步 nn1 的元数据信息
[leon@hadoop103 ~]$ hdfs namenode -bootstrapStandby
[leon@hadoop104 ~]$ hdfs namenode -bootstrapStandby
  1. 启动[nn2]和[nn3]
[leon@hadoop103 ~]$ hdfs --daemon start namenode
[leon@hadoop104 ~]$ hdfs --daemon start namenode
  1. 查看web页面显示
    在这里插入图片描述
    在这里插入图片描述

在这里插入图片描述

  1. 在所有节点上,启动 datanode
[leon@hadoop102 ~]$ hdfs --daemon start datanode
[leon@hadoop103 ~]$ hdfs --daemon start datanode
[leon@hadoop104 ~]$ hdfs --daemon start datanode
  1. 将[nn1]切换为 Active
[leon@hadoop102 ~]$ hdfs haadmin -transitionToActive nn1

11.查看是否Active

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

在这里插入图片描述

HDFS-HA 自动模式
集群规划
hadoop102hadoop103hadoop104
NameNodeNameNodeNameNode
DataNodeDataNodeDataNode
JournalNodeJournalNodeJournalNode
ZookeeperZookeeperZookeeper
ZKFCZKFCZKFC
修改配置文件
  1. 在 hdfs-site.xml 中增加
<!-- 启用 nn 故障自动转移 -->
<property>
	<name>dfs.ha.automatic-failover.enabled</name>
	<value>true</value>
</property>
  1. 在 core-site.xml 文件中增加
<!-- 指定 zkfc 要连接的 zkServer 地址 -->
<property>
	<name>ha.zookeeper.quorum</name>
	<value>hadoop102:2181,hadoop103:2181,hadoop104:2181</value>
</property>
  1. 修改后分发配置文件
[leon@hadoop102 etc]$ xsync hadoop/   # 在/opt/ha/hadoop-3.1.3/etc目录下
启动
  1. 关闭所有 HDFS 服务:
[leon@hadoop102 ~]$ stop-dfs.sh
  1. 启动 Zookeeper 集群(ZK集群的安装部署可以看这篇):
[leon@hadoop102 ~]$ zkServer.sh start
[leon@hadoop103 ~]$ zkServer.sh start
[leon@hadoop104 ~]$ zkServer.sh start
  1. 启动 Zookeeper 以后,然后再初始化 HA 在 Zookeeper 中状态:
[leon@hadoop102 ~]$ hdfs zkfc -formatZK
  1. 启动 HDFS 服务
[leon@hadoop102 ~]$ start-dfs.sh
YARN-HA 配置(这个是在上述zk的基础上进行的)
修改配置文件:
  1. yarn-site.xml
<?xml version="1.0"?>
<!--
  Licensed under the Apache License, Version 2.0 (the "License");
  you may not use this file except in compliance with the License.
  You may obtain a copy of the License at

    http://www.apache.org/licenses/LICENSE-2.0

  Unless required by applicable law or agreed to in writing, software
  distributed under the License is distributed on an "AS IS" BASIS,
  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  See the License for the specific language governing permissions and
  limitations under the License. See accompanying LICENSE file.
-->
<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 的逻辑列表-->
    <property>
        <name>yarn.resourcemanager.ha.rm-ids</name>
        <value>rm1,rm2,rm3</value>
    </property>
    <!-- ========== rm1 的配置 ========== -->
    <!-- 指定 rm1 的主机名 -->
    <property>
        <name>yarn.resourcemanager.hostname.rm1</name>
        <value>hadoop102</value>
    </property>
    <!-- 指定 rm1 的 web 端地址 -->
    <property>
        <name>yarn.resourcemanager.webapp.address.rm1</name>
        <value>hadoop102:8088</value>
    </property>
    <!-- 指定 rm1 的内部通信地址 -->
    <property>
        <name>yarn.resourcemanager.address.rm1</name>
        <value>hadoop102:8032</value>
    </property>
    <!-- 指定 AM 向 rm1 申请资源的地址 -->
    <property>
        <name>yarn.resourcemanager.scheduler.address.rm1</name>
        <value>hadoop102:8030</value>
    </property>
    <!-- 指定供 NM 连接的地址 -->
    <property>
        <name>yarn.resourcemanager.resource-tracker.address.rm1</name>
        <value>hadoop102:8031</value>
    </property>
    <!-- ========== rm2 的配置 ========== -->
    <!-- 指定 rm2 的主机名 -->
    <property>
        <name>yarn.resourcemanager.hostname.rm2</name>
        <value>hadoop103</value>
    </property>
    <property>
        <name>yarn.resourcemanager.webapp.address.rm2</name>
        <value>hadoop103:8088</value>
    </property>
    <property>
        <name>yarn.resourcemanager.address.rm2</name>
        <value>hadoop103:8032</value>
    </property>
    <property>
        <name>yarn.resourcemanager.scheduler.address.rm2</name>
        <value>hadoop103:8030</value>
    </property>
    <property>
        <name>yarn.resourcemanager.resource-tracker.address.rm2</name>
        <value>hadoop103:8031</value>
    </property>
    <!-- ========== rm3 的配置 ========== -->
    <!-- 指定 rm1 的主机名 -->
    <property>
        <name>yarn.resourcemanager.hostname.rm3</name>
        <value>hadoop104</value>
    </property>
    <!-- 指定 rm1 的 web 端地址 -->
    <property>
        <name>yarn.resourcemanager.webapp.address.rm3</name>
        <value>hadoop104:8088</value>
    </property>
    <!-- 指定 rm1 的内部通信地址 -->
    <property>
        <name>yarn.resourcemanager.address.rm3</name>
        <value>hadoop104:8032</value>
    </property>
    <!-- 指定 AM 向 rm1 申请资源的地址 -->
    <property>
        <name>yarn.resourcemanager.scheduler.address.rm3</name>
        <value>hadoop104:8030</value>
    </property>
    <!-- 指定供 NM 连接的地址 -->
    <property>
        <name>yarn.resourcemanager.resource-tracker.address.rm3</name>
        <value>hadoop104:8031</value>
    </property>
    <!-- 指定 zookeeper 集群的地址 -->
    <property>
        <name>yarn.resourcemanager.zk-address</name>
        <value>hadoop102:2181,hadoop103:2181,hadoop104: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>
    <!-- 环境变量的继承 -->
    <property>
        <name>yarn.nodemanager.env-whitelist</name>
        <value>
            JAVA_HOME,HADOOP_COMMON_HOME,HADOOP_HDFS_HOME,HADOOP_CONF_DIR,CLASSPATH_PREPEND_DISTCACHE,HADOOP_YARN_HOME,HADOOP_MAPRED_HOME
        </value>
    </property>
</configuration>
  1. 分发yarn-site.xml
  2. 启动YARN
[leon@hadoop102 ~]$ start-yarn.sh # 在 hadoop102或者hadoop103中启动
  1. 查看服务状态
[leon@hadoop102 ~]$ yarn rmadmin -getServiceState rm1
  1. web 端查看 hadoop102:8088 和 hadoop103:8088 的 YARN 的状态
    在这里插入图片描述
HA集群最终配置
hadoop102hadoop103hadoop104
NameNodeNameNodeNameNode
DataNodeDataNodeDataNode
JournalNodeJournalNodeJournalNode
ZookeeperZookeeperZookeeper
ZKFCZKFCZKFC
ResourceManagerResourceManagerResourceManager
NodeManagerNodeManagerNodeManager

总结

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

  • 3
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值