Hadoop HA 集群搭建,基于hadoop3

Hadoop HA

需要先看 hadoop3.3.0集群搭建Zookeeper3.5.7集群搭建的知识,才能来使用Hadoop HA

注意:Hadoop HA 主要分成:HDFS HA 和Yarn HA

一、HDFS HA 和YARN HA的原理

(一)、HDFS HA的原理

注意:Zookeeper是维护少量协调数据,通知客户端这些数据的改变和监视客户端故障的高可用服务

HADF 的主要包括:NameNodeSecondaryNameNodeDataNode

  • NameNode 主要负责的是元数据的存储
  • SecondaryNameNode 主要是负责的是edits和fsimage的合并
  • DataNode主要负责的是数据的存储

问题:如果NameNode主机宕机了或者机器的维护升级,会导致整个集群无法使用

HDFS HA 思路:

  • 通过配置多个NameNode进行热备来解决
  • 如果active的NameNode出现问题,会立刻切换到另外一台NameNode
  • 平时standby的NameNode会将复制将fsimage和edits进行合并
  • 通过JournalNode来解决edits到其他NameNode的同步问题,让数据保持一致
  • 最后增加了两个新的组件:ZookeeperZKFailoveController(ZKFC)进程,实现故障的监测,并实现自动化转换。

在这里插入图片描述

故障的转移机制:

1、假如active的NameNode假死(宕机)了

2、ZKFailovercontroller(zkfc)会检测到假死

3、检测到假死后,会通知另外一台NameNode的zkfc

4、另外一台zkfc收到通知后,会进行ssh 来kill NameNode

5、如果说kill失败会调用用户自定义的脚本程序

6、脚本运行成后,获取命令运行结果

7、运行成功后,激活本台namenode为active

(二)、YARN HA的原理

在这里插入图片描述

创建多个ResourceManger,有active和standby

1、Active 的ResourceManger,会在Zookeeper中注册临时节点,Standby的ResourceManger发现Zookeeper有子节点,它就只能作为Standby了

2、Standby的ResourceManager,在定时轮询Zookeeper的子节点,如果发现Active的ResourceManager创建的子节点挂了,它会立刻进行篡位,将自己注册子节点

二、Hadoop HA的集群规划

在这里插入图片描述

三、Hadoop HA 的搭建

(一) 、HDFS HA 的搭建

core-site.xml

vim $HADOOP_HOME/etc/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>
<!-- 指定 zkfc 要连接的 zkServer 地址 -->
<property>
<name>ha.zookeeper.quorum</name>
<value>hadoop1:2181,hadoop2:2181,hadoop3:2181</value>
</property>

</configuration>

注意:

  • fs.defaultFS 中的 hdfs://mycluster,是我们现在的集群名字,注意这点不要弄错了,后面会使用到

hdfs-site.xml

vim $HADOOP_HOME/etc/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>hadoop1:8020</value>
</property>
<property>
<name>dfs.namenode.rpc-address.mycluster.nn2</name>
<value>hadoop2:8020</value>
</property>

<property>
<name>dfs.namenode.rpc-address.mycluster.nn3</name>
<value>hadoop3:8020</value>
</property>
<!-- NameNode 的 http 通信地址 -->
<property>
<name>dfs.namenode.http-address.mycluster.nn1</name>
<value>hadoop1:9870</value>
</property>
<property>
<name>dfs.namenode.http-address.mycluster.nn2</name>
<value>hadoop2:9870</value>
</property>
<property>
<name>dfs.namenode.http-address.mycluster.nn3</name>
<value>hadoop3:9870</value>
</property>
<!-- 指定 NameNode 元数据在 JournalNode 上的存放位置 -->
<property>
<name>dfs.namenode.shared.edits.dir</name>
<value>qjournal://hadoop1:8485;hadoop2:8485;hadoop3: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/andy/.ssh/id_rsa</value>
</property>
<!-- 启用 nn 故障自动转移 -->
<property>
<name>dfs.ha.automatic-failover.enabled</name>
<value>true</value>
</property>
</configuration>

(二)、Yarn HA的搭建

yarn-site.xml

vim $HADOOP_HOME/etc/hadoop/yarn-site.xml

添加内容如下:

<configuration>
<property>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
</property>

<!-- 开启日志聚集功能 -->
<property>
<name>yarn.log-aggregation-enable</name>
<value>true</value>
</property>
<!-- 设置日志聚集服务器地址 -->
<property>
<name>yarn.log.server.url</name>
<value>http://hadoop01:19888/jobhistory/logs</value>
</property>
<!-- 设置日志保留时间为 7 天 -->
<property>
<name>yarn.log-aggregation.retain-seconds</name>
<value>604800</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>hadoop1</value>
</property>
<!-- 指定 rm1 的 web 端地址 -->
<property>
<name>yarn.resourcemanager.webapp.address.rm1</name>
<value>hadoop1:8088</value>
</property>
<!-- 指定 rm1 的内部通信地址 -->
<property>
<name>yarn.resourcemanager.address.rm1</name>
<value>hadoop1:8032</value>
</property>
<!-- 指定 AM 向 rm1 申请资源的地址 -->
<property>
<name>yarn.resourcemanager.scheduler.address.rm1</name>
<value>hadoop1:8030</value>
</property>
<!-- 指定供 NM 连接的地址 -->
<property>
<name>yarn.resourcemanager.resource-tracker.address.rm1</name>
<value>hadoop1:8031</value>
</property>
<!-- ========== rm2 的配置 ========== -->
<!-- 指定 rm2 的主机名 -->
<property>
<name>yarn.resourcemanager.hostname.rm2</name>
<value>hadoop2</value>
</property>
<property>
<name>yarn.resourcemanager.webapp.address.rm2</name>
<value>hadoop2:8088</value>
</property>
<property>
<name>yarn.resourcemanager.address.rm2</name>
<value>hadoop2:8032</value>
</property>
<property>
<name>yarn.resourcemanager.scheduler.address.rm2</name>
<value>hadoop2:8030</value>
</property>
<property>
<name>yarn.resourcemanager.resource-tracker.address.rm2</name>
<value>hadoop2:8031</value>
</property>
<!-- ========== rm3 的配置 ========== -->
<!-- 指定 rm3 的主机名 -->
<property>
<name>yarn.resourcemanager.hostname.rm3</name>
<value>hadoop3</value>
</property>
<!-- 指定 rm3 的 web 端地址 -->
<property>
<name>yarn.resourcemanager.webapp.address.rm3</name>
<value>hadoop3:8088</value>
</property>
<!-- 指定 rm3 的内部通信地址 -->
<property>
<name>yarn.resourcemanager.address.rm3</name>
<value>hadoop3:8032</value>
</property>
<!-- 指定 AM 向 rm3 申请资源的地址 -->
<property>
<name>yarn.resourcemanager.scheduler.address.rm3</name>
<value>hadoop3:8030</value>
</property>
<!-- 指定供 NM 连接的地址 -->
<property>
<name>yarn.resourcemanager.resource-tracker.address.rm3</name>
<value>hadoop3:8031</value>
</property>
<!-- 指定 zookeeper 集群的地址 -->
<property>
<name>yarn.resourcemanager.zk-address</name>
<value>hadoop1:2181,hadoop2:2181,hadoop3: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,CLAS SPATH_PREPEND_DISTCACHE,HADOOP_YARN_HOME,HADOOP_MAPRED_HOME</value>
</property>

</configuration>

四、启动Hadoop HA

(一)、启动journalNode

分别需要在hadoop1、Hadoop2、hadoop3启动

hdfs --daemon start journalnode

在这里插入图片描述

会创建一个logs文件夹,来保存日志文件

默认logs的位置是在$HADOOP_HOME/logs下面的

在这里插入图片描述

修改方法:$HADOOP_HOME/etc/hadooop/hadoop-env.sh中添加

export HADOOP_LOG_DIR=路径

补充知识:

在这里插入图片描述

  • 以.log结尾,通过的log4j记录的,采用日常滚动文件追加方式(daily rolling file)来循环管理
    文件

  • 以.out结尾,记录标准输出和标准错误日志,但是hadoop中少用。重启守护进程时,
    会重新创建新的文件来记录日志,而且只会保留5个日志文件,从5~1(5是最旧的

文件)

(二)、namenode格式化

在任意一个节点进行格式化,我选择hadoop1

hdfs namenode -format

在这里插入图片描述

(三)启动Zookeeper集群

分别在hadoop1、hadoop2、hadoop3中执行

zkServer.sh start

或者使用脚本(自己编写的,相关内容请看Zookeeper的集群搭建相关知识点)

zk.sh start

在这里插入图片描述

(四)初始化HA在Zookeeper的状态

hdfs zkfc -formatZK

在这里插入图片描述

(五)、需要将hadoop1(nn1)中NameNode初始化,与hadoop2(nn2)和hadoop3(nn3)进行同步

分别在hadoop2、hadoop3中进行执行

hdfs namenode -bootstrapStandby

(六)、启动HDFS、yarn

start-dfs.sh
start-yarn.sh

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-7kvZFX0w-1658405591745)(G:/md%E7%AC%94%E8%AE%B0%E7%9A%84pdf/%E5%A4%A7%E6%95%B0%E6%8D%AEpdf/hadoop/hadoop%E7%9A%84HA%E9%AB%98%E5%8F%AF%E7%94%A8/12ea959b203e4113b20f7a70eb58a285.png)]

在这里插入图片描述

补充知识:

  • 查看ResourceManager的状态
yarn rmadmin -getServiceState rm1
yarn rmadmin -getServiceState rm2
yarn rmadmin -getServiceState rm3

在这里插入图片描述

  • 2
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 8
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值