Hadoop HA
需要先看 hadoop3.3.0集群搭建、Zookeeper3.5.7集群搭建的知识,才能来使用Hadoop HA
注意:Hadoop HA 主要分成:HDFS HA 和Yarn HA
一、HDFS HA 和YARN HA的原理
(一)、HDFS HA的原理
注意:Zookeeper是维护少量协调数据,通知客户端这些数据的改变和监视客户端故障的高可用服务
HADF 的主要包括:NameNode
、SecondaryNameNode
、DataNode
NameNode
主要负责的是元数据的存储SecondaryNameNode
主要是负责的是edits和fsimage
的合并DataNode
主要负责的是数据的存储
问题:如果NameNode主机宕机了或者机器的维护升级,会导致整个集群无法使用
HDFS HA 思路:
- 通过配置多个NameNode进行热备来解决
- 如果active的NameNode出现问题,会立刻切换到另外一台NameNode
- 平时standby的NameNode会将复制将fsimage和edits进行合并
- 通过JournalNode来解决edits到其他NameNode的同步问题,让数据保持一致
- 最后增加了两个新的组件:
Zookeeper
和ZKFailoveController(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