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核心问题

Hadoop学习---11、HA高可用_第1张图片
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>
  
  <property>
    <name>fs.defaultFSname>
    <value>hdfs://myclustervalue>
  property>

  
  <property>
    <name>hadoop.tmp.dirname>
    <value>/opt/ha/hadoop-3.1.3/datavalue>
  property>
configuration>

5、配置hdfs-site.xml

<configuration>

  
  <property>
    <name>dfs.namenode.name.dirname>
    <value>file://${hadoop.tmp.dir}/namevalue>
  property>

  
  <property>
    <name>dfs.datanode.data.dirname>
    <value>file://${hadoop.tmp.dir}/datavalue>
  property>

  
  <property>
    <name>dfs.journalnode.edits.dirname>
    <value>${hadoop.tmp.dir}/jnvalue>
  property>

  
  <property>
    <name>dfs.nameservicesname>
    <value>myclustervalue>
  property>

  
  <property>
    <name>dfs.ha.namenodes.myclustername>
    <value>nn1,nn2,nn3value>
  property>

  
  <property>
    <name>dfs.namenode.rpc-address.mycluster.nn1name>
    <value>hadoop102:8020value>
  property>
  <property>
    <name>dfs.namenode.rpc-address.mycluster.nn2name>
    <value>hadoop103:8020value>
  property>
  <property>
    <name>dfs.namenode.rpc-address.mycluster.nn3name>
    <value>hadoop104:8020value>
  property>

  
  <property>
    <name>dfs.namenode.http-address.mycluster.nn1name>
    <value>hadoop102:9870value>
  property>
  <property>
    <name>dfs.namenode.http-address.mycluster.nn2name>
    <value>hadoop103:9870value>
  property>
  <property>
    <name>dfs.namenode.http-address.mycluster.nn3name>
    <value>hadoop104:9870value>
  property>

  
  <property>
    <name>dfs.namenode.shared.edits.dirname>
<value>qjournal://hadoop102:8485;hadoop103:8485;hadoop104:8485/myclustervalue>
  property>

  
  <property>
    <name>dfs.client.failover.proxy.provider.myclustername>
    <value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvidervalue>
  property>

  
  <property>
    <name>dfs.ha.fencing.methodsname>
    <value>sshfencevalue>
  property>

  
  <property>
    <name>dfs.ha.fencing.ssh.private-key-filesname>
    <value>/home/atguigu/.ssh/id_rsavalue>
  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
Hadoop学习---11、HA高可用_第2张图片

hadoop103
Hadoop学习---11、HA高可用_第3张图片

hadoop104

Hadoop学习---11、HA高可用_第4张图片
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增加


<property>
	<name>dfs.ha.automatic-failover.enabledname>
	<value>truevalue>
property>

(2)在core-site.xml增加


<property>
	<name>ha.zookeeper.quorumname>
	<value>hadoop102:2181,hadoop103:2181,hadoop104:2181value>
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工作机制

Hadoop学习---11、HA高可用_第5张图片

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

你可能感兴趣的:(Hadoop学习,hadoop,学习,大数据)