Hadoop学习---11、HA高可用

本文涉及的产品
服务治理 MSE Sentinel/OpenSergo,Agent数量 不受限
简介: Hadoop学习---11、HA高可用

1、Hadoop HA高可用

1.1 HA概述

1、所谓HA(High Availablity),即高可用(7 * 24小时不中断服务)。

2、实现高可用最关键的策略是消除单点故障。HA严格来说应该分成各个组件的HA机制:HDFS的HA和YARN的HA。

3、NameNode主要在以下两个方面影响HDFS集群

(1)NameNode机器发生意外,如宕机,集群将无法使用,直到管理员重启。

(2)NameNode机器需要升级,包括软件、硬件升级,此时集群也将无法使用。

HDFS HA功能通过配置多个NameNodes(Active/Standby)实现在集群中对NameNode的热备来解决上述问题。如果出现故障,如机器崩溃或机器需要升级维护,这时可通过此种方式将NameNode很快的切换到另外一台机器。

1.2 HDFS-HA核心问题

05f68e73a7884feea3c4c37855b11d87.png

1、怎么保证三台namenode的数据一致

(1)FsImage:让一台nn生成数据,让其他机器nn同步

(2)Edits:需要引进新的模块JournalNode来保证edits的文件的数据一致性。

2、怎么让同时只有一台nn是active吗,其它所有是standby的

(1)手动分配

(2)自动分配

3、2nn在ha架构中并不存在,定期合并FsImage和Edits的活谁来干?

有standby的nn来干

4、如果nn真的发生问题,怎么让其他的nn上位干活

(1)手动故障转移

(2)自动故障转移

1.3 HDFS-HA手动模式

1.3.1 环境准备

1、修改IP

2、修改主机名和IP地址的映射

3、关闭防火墙

4、ssh免密登录

5、安装JDK,配置环境变量

1.3.2 规划集群

hadoop102 hadoop103 hadoop104
NameNode NameNode NameNode
JournalNode JournalNode JournalNode
DataNode DataNode DataNode
1.3.3配置HDFS-HA集群

1、官方地址:http://hadoop.apache.org/

2、在opt目录下创建一个ha文件夹

cd /opt
sudo mkdir ha
sudo chown zhm:zhm /opt/ha

3、将/opt/module/下的 hadoop-3.1.3拷贝到/opt/ha目录下(记得删除data 和 log目录)

cp -r /opt/module/hadoop-3.1.3 /opt/ha/

4、配置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/ha/hadoop-3.1.3/data</value>
  </property>
</configuration>

5、配置hdfs-site.xml

<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/atguigu/.ssh/id_rsa</value>
  </property>
</configuration>

6、分发配置好的hadoop环境到其他节点

1.3.4 启动HDFS-HA集群

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

sudo vim /etc/profile.d/my_env.sh

填入内容:

#HADOOP_HOME
export HADOOP_HOME=/opt/ha/hadoop-3.1.3
export PATH=$PATH:$HADOOP_HOME/bin
export PATH=$PATH:$HADOOP_HOME/sbin

然后再三台机器上source环境变量

source /etc/profile

2、在各个JournalNode(每台机器)节点上,输入以下命令启动JournalNode服务

hdfs --daemon  start journalnode

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

hdfs namenode -format
hdfs --daemon start namenode

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

hdfs namenode -bootstrapStandby

5、启动[nn2]和[nn3]

hdfs --daemon start namenode

6、查看web页面显示

hadoop102

4c4f8d8b2ce8440ab48e066864d8342e.png

hadoop103


b120c02ae49440068134e29b8984a2fb.png


hadoop104


d0dbfb14436d455299eea6cce8e4faea.png

7、在所有节点上启动DataNode

hdfs --daemon start datanode

8、将[nn1]切换为active

hdfs haadmin -transitionToActive nn1

9、查看是否Active

hdfs haadmin -getServiceState nn1

1.4 HDFS-HA 自动模式

1.4.1 HDFS-HA自动故障转移工作机制

自动故障转移为HDFS部署增加了两个组件:Zookeeper和ZKFailoverController(ZKFC)进程,如图所示。Zookeeper是维护少量协调数据,通知客户端这些数据的改变和监视客户端故障的高可用服务。

1.4.2 HDFS-HA自动故障转移的集群规划

hadoop102 hadoop103 hadoop104
NameNode NameNode NameNode
JournalNode JournalNode JournalNode
DataNode DataNode DataNode
Zookeeper Zookeeper Zookeeper
ZKFC ZKFC ZKFC

1.4.3 配置HDFS-HA自动故障转移

1、具体配置

(1)在hdfs-site.xml增加

<!-- 启用nn故障自动转移 -->
<property>
  <name>dfs.ha.automatic-failover.enabled</name>
  <value>true</value>
</property>

(2)在core-site.xml增加

<!-- 指定zkfc要连接的zkServer地址 -->
<property>
  <name>ha.zookeeper.quorum</name>
  <value>hadoop102:2181,hadoop103:2181,hadoop104:2181</value>
</property>

(3)修改之后分发配置文件

2、启动

(1)关闭所有HDFS服务:

stop-dfs.sh

(2)启动Zookeeper集群(没有配置一键启动的话,就去每个节点启动一次)

zkServer.sh start

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

hdfs zkfc -formatZK

(4)启动HDFS服务

start-dfs.sh

(5)可以去zkCli.sh客户端查看Namenode选举锁节点内容

get -s /hadoop-ha/mycluster/ActiveStandbyElectorLock

3、验证

(1)将Active NameNode进程kill,查看网页端三台Namenode的状态变化。

1.5 Yarn-HA配置

1.5.1 Yarn-HA工作机制

28486ad96b2d4b5a98555edf03684dd9.png

1.5.2 配置Yarn-HA集群

1、环境准备

(1)修改IP

(2)修改主机名及主机名和IP地址的映射

(3)关闭防火墙

(4)ssh免密登录

(5)安装JDK,配置环境变量等

(6)配置Zookeeper集群

2、规划集群

hadoop102 hadoop103 hadoop104
ResourceManager ResourceManager ResourceManager
NodeManager NodeManager NodeManager
Zookeeper Zookeeper Zookeeper

3、核心问题

(1)如果当前Active rm挂了,其他rm怎么将其它standby rm 上位。

核心原理和HDFS一样,利用了zk的临时节点

(2)当前rm上有很多的计算程序在等待运行,其他的rm怎么将这些程序接手过来接着跑

rm会将当前的所有计算程序的状态存储在zk中,其他rm上位后会去读取,然后接着跑。

4、具体配置

(1)yarn-site.xml

<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>

(2)同步更新其他节点的配置信息,分发配置文件

4、启动Yarn

(1)在有ResourceManager的节点启动。

start-yarn.sh

(2)查看服务状态

yarn rmdamin -getServiceState rm1

(3)可以去zkCli.sh客户端查看ResourceManager选举锁节点内容。

get -s /yarn-leader-election/cluster-yarn1/ActiveStandbyElectorLock

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

1.6 Hadoop HA的最终规划

将整个ha搭建完成后,集群将形成以下模样

hadoop102 hadoop103 hadoop104
NameNode NameNode NameNode
JournalNode JournalNode JournalNode
DataNode DataNode DataNode
Zookeeper Zookeeper Zookeeper
ZKFC ZKFC ZKFC
ResourceManager ResourceManager ResourceManager
NodeManager NodeManager NodeManager


相关实践学习
基于MSE实现微服务的全链路灰度
通过本场景的实验操作,您将了解并实现在线业务的微服务全链路灰度能力。
相关文章
|
7月前
|
分布式计算 Hadoop 大数据
Hadoop学习:深入解析MapReduce的大数据魔力之数据压缩(四)
Hadoop学习:深入解析MapReduce的大数据魔力之数据压缩(四)
|
7月前
|
分布式计算 Hadoop 大数据
Hadoop学习:深入解析MapReduce的大数据魔力(三)
Hadoop学习:深入解析MapReduce的大数据魔力(三)
|
3天前
|
机器学习/深度学习 SQL 分布式计算
Hadoop2.6(NN/RM)高可用集群安装与部署
Hadoop2.6(NN/RM)高可用集群安装与部署
|
13天前
|
分布式计算 Hadoop 大数据
Hadoop【hadoop学习大纲完全总结01+02+03+04+05】【自学阶段整理的xmind思维导图分享】【点击可放大看高清】
【4月更文挑战第5天】Hadoop【hadoop学习大纲完全总结01+02+03+04+05】【自学阶段整理的xmind思维导图分享】【点击可放大看高清】
37 5
|
7月前
|
存储 分布式计算 Hadoop
Hadoop学习:深入解析MapReduce的大数据魔力(二)
Hadoop学习:深入解析MapReduce的大数据魔力(二)
|
7月前
|
存储 分布式计算 Hadoop
Hadoop学习:深入解析MapReduce的大数据魔力(一)
Hadoop学习:深入解析MapReduce的大数据魔力(一)
108 0
|
7月前
|
存储 XML 分布式计算
Hadoop学习指南:探索大数据时代的重要组成——HDFS(下)
Hadoop学习指南:探索大数据时代的重要组成——HDFS(下)
|
7月前
|
分布式计算 Hadoop Java
Hadoop学习指南:探索大数据时代的重要组成——运行环境搭建
Hadoop学习指南:探索大数据时代的重要组成——运行环境搭建
|
15天前
|
存储 分布式计算 Hadoop
大数据处理架构Hadoop
【4月更文挑战第10天】Hadoop是开源的分布式计算框架,核心包括MapReduce和HDFS,用于海量数据的存储和计算。具备高可靠性、高扩展性、高效率和低成本优势,但存在低延迟访问、小文件存储和多用户写入等问题。运行模式有单机、伪分布式和分布式。NameNode管理文件系统,DataNode存储数据并处理请求。Hadoop为大数据处理提供高效可靠的解决方案。
37 2
|
15天前
|
分布式计算 Hadoop 大数据
大数据技术与Python:结合Spark和Hadoop进行分布式计算
【4月更文挑战第12天】本文介绍了大数据技术及其4V特性,阐述了Hadoop和Spark在大数据处理中的作用。Hadoop提供分布式文件系统和MapReduce,Spark则为内存计算提供快速处理能力。通过Python结合Spark和Hadoop,可在分布式环境中进行数据处理和分析。文章详细讲解了如何配置Python环境、安装Spark和Hadoop,以及使用Python编写和提交代码到集群进行计算。掌握这些技能有助于应对大数据挑战。

相关实验场景

更多