前言

环境介绍

虚拟机软件:VirtualBox

Linux 发行版本:Ubuntu 20.04.4

虚拟机核心数:1 core

虚拟机内存:2 GB

JDK 版本:1.8.0_202

Hadoop 版本:3.2.3

ZK 版本:3.8.0

实验机搭建

HA 概述

HA 即高可用,在 Hadoop 中,只有 NN 和 MR 会出现单点故障。所以只需要对 NN 和 MR 做 HA。

DN 和 NM 本身就会起多个,所以不存在单点

2NN 用以整合 Image 和 Edit,做 HA 后,处于 standby 的 NN 也会整合 Image 和 Edit,所以 2NN 就不需要了

HA 原理就是额外起一台机子作冗余备份,当主机挂了,就让备机顶上。按照该想法会存在以下问题:

  1. 主备间如何同步 Edit?
  2. 如何检测主机下线?
  3. 如何做故障转移?

对于问题一:Hadoop 引入 JournalNode 解决。

对于问题二:使用 ZK 来检测机器状态变化 。

对于问题三:Hadoop 引入 DFSZKFailoverController 解决。

引入新的部件,为了防止这些也是是单点的,所以也得给他们起多个。

集群规划

按照以上分析,便有以下集群规划

node01 node02 node03
NameNode NameNode
DFSZKFailoverController DFSZKFailoverController
JournalNode JournalNode JournalNode
DataNode DataNode DataNode
ZK ZK ZK
ResourceManager ResourceManager
NodeManager NodeManager NodeManager

JDK 环境变量

$ vim /etc/profile
# 拷贝以下内容
export JAVA_HOME=/opt/jdk1.8.0_202
export JRE_HOME=$JAVA_HOME/jre
export PATH=$PATH:$JAVA_HOME/bin
export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar# 刷新配置
$ source /etc/profile$ java -version # 出现以下结果,表示配置成功
java version "1.8.0_202"
Java(TM) SE Runtime Environment (build 1.8.0_202-b08)
Java HotSpot(TM) 64-Bit Server VM (build 25.202-b08, mixed mode)# 配置成功后分发
$ xsync /opt/jdk1.8.0_202
$ xsync /etc/profile

分发后,记得给所有机子刷新配置。后续不在做特殊说明。

ZK 集群搭建

ZK 环境变量

$ vim /etc/profile
# 拷贝以下内容
export ZK_HOME=/opt/zookeeper-3.8.0
export PATH=$PATH:$JAVA_HOME/bin:$ZK_HOME/bin$ xsync /opt/zookeeper-3.8.0
$ xsync /etc/profile

修改 zoo.cfg

$ cd /opt/zookeeper-3.8.0
$ mkdir zkData
$ cd conf
$ mv zoo_sample.cfg zoo.cfg
$ vim zoo.cfgdataDir=/opt/zookeeper-3.8.0/zkData
server.1=node01:2888:3888
server.2=node02:2888:3888
server.3=node03:2888:3888$ xsync /opt/zookeeper-3.8.0/conf/zoo.cfg

配置 myid:填写上面 server.x 中对应的数字 x,如:1、2、3。每个机子都不一样

$ vim /opt/zookeeper-3.8.0/zkData/myid

ZK 集群启动

$ xcall zkServer.sh start
$ xcall zkServer.sh status

检查是否启动成功

$ xcall zkServer.sh status
---------------- node01 ----------------
ZooKeeper JMX enabled by default
Using config: /opt/zookeeper-3.8.0/bin/../conf/zoo.cfg
Client port found: 2181. Client address: localhost. Client SSL: false.
Mode: follower
---------------- node02 ----------------
ZooKeeper JMX enabled by default
Using config: /opt/zookeeper-3.8.0/bin/../conf/zoo.cfg
Client port found: 2181. Client address: localhost. Client SSL: false.
Mode: leader
---------------- node03 ----------------
ZooKeeper JMX enabled by default
Using config: /opt/zookeeper-3.8.0/bin/../conf/zoo.cfg
Client port found: 2181. Client address: localhost. Client SSL: false.
Mode: follower
--------------- complete ---------------

HDFS HA 搭建

Hadoop 环境变量

$ vim /etc/profile
# 拷贝以下内容
export HADOOP_HOME=/opt/hadoop-3.2.3
export PATH=$PATH:$JAVA_HOME/bin:$ZK_HOME/bin:$HADOOP_HOME/bin:$HADOOP_HOME/sbin$ xsync /opt/hadoop-3.2.3
$ xsync /etc/profile

修改 core-site.xml

$ vim /opt/hadoop-3.2.3/etc/hadoop/core-site.xml
<configuration>
<!-- 把两个NameNode)的地址组装成一个集群 cluster --><property><name>fs.defaultFS</name><value>hdfs://cluster</value></property><!-- 指定hadoop运行时产生文件的存储目录 --><property><name>hadoop.tmp.dir</name><value>/opt/hadoop-3.2.3/data/tmp</value></property><!-- 指定ZK --><property><name>ha.zookeeper.quorum</name><value>node01:2181,node02:2181,node03:2181</value></property>
</configuration>
$ xsync /opt/hadoop-3.2.3/etc/hadoop/core-site.xml

修改 hdfs-site.xml

node01 node02 node03
NameNode NameNode
JournalNode JournalNode JournalNode
DataNode DataNode DataNode
$ vim /opt/hadoop-3.2.3/etc/hadoop/hdfs-site.xml
<configuration>
<!-- 完全分布式集群名称 --><property><name>dfs.nameservices</name><value>cluster</value></property><!-- 集群中NameNode节点都有哪些 --><property><name>dfs.ha.namenodes.cluster</name><value>nn1,nn2</value></property><!-- nn1的RPC通信地址 --><property><name>dfs.namenode.rpc-address.cluster.nn1</name><value>node01:9000</value></property><!-- nn2的RPC通信地址 --><property><name>dfs.namenode.rpc-address.cluster.nn2</name><value>node02:9000</value></property><!-- nn1的http通信地址 --><property><name>dfs.namenode.http-address.cluster.nn1</name><value>node01:50070</value></property><!-- nn2的http通信地址 --><property><name>dfs.namenode.http-address.cluster.nn2</name><value>node02:50070</value></property><!-- 指定NameNode元数据在JournalNode上的存放位置 --><property><name>dfs.namenode.shared.edits.dir</name><value>qjournal://node01:8485;node02:8485;node03:8485/cluster</value></property><!-- 配置隔离机制,即同一时刻只能有一台服务器对外响应 --><property><name>dfs.ha.fencing.methods</name><value>sshfenceshell(/bin/true)</value></property><!-- 使用隔离机制时需要ssh无秘钥登录--><property><name>dfs.ha.fencing.ssh.private-key-files</name><value>~/.ssh/id_rsa</value></property><!-- 声明journalnode服务器存储目录--><property><name>dfs.journalnode.edits.dir</name><value>/opt/hadoop-3.2.3/data/jn</value></property><!-- 关闭权限检查--><property><name>dfs.permissions.enable</name><value>false</value></property><!-- 访问代理类:client,cluster,active配置失败自动切换实现方式--><property><name>dfs.client.failover.proxy.provider.cluster</name><value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value></property><!-- 自动故障转移 --><property><name>dfs.ha.automatic-failover.enabled</name><value>true</value></property>
</configuration>
$ xsync /opt/hadoop-3.2.3/etc/hadoop/hdfs-site.xml

修改 hdfs-env.sh

$ vim /opt/hadoop-3.2.3/etc/hadoop/hadoop-env.sh
export JAVA_HOME=/opt/jdk1.8.0_202
$ xsync /opt/hadoop-3.2.3/etc/hadoop/hadoop-env.sh

修改 start-dfs.sh 和 stop-dfs.sh

$ vim /opt/hadoop-3.2.3/sbin/start-dfs.sh # stop-dfs.sh 同理
# 开头添加以下内容
HDFS_DATANODE_USER=root
HDFS_NAMENODE_USER=root
HDFS_JOURNALNODE_USER=root
HDFS_ZKFC_USER=root$ xsync /opt/hadoop-3.2.3/sbin/start-dfs.sh

HDFS 集群启动

所有节点

$ hadoop-daemon.sh start journalnode
$ hadoop-daemon.sh start datanode

node01

$ hdfs namenode -format
$ hadoop-daemon.sh start namenode

node02

$ hdfs namenode -bootstrapStandby
$ hadoop-daemon.sh start namenode

HA 自动切换

启用自动切换

  1. 关闭 hdfs 服务 stop-dfs.sh
  2. 保证 ZK 集群已启动,初始化 HA 在 ZK 的状态 hdfs zkfc -formatZK
  3. 启动 hdfs 服务 start-dfs.sh
  4. 为 NN 所在节点启动 DFSZK Failover Controller, hadoop-daemon.sh start zkfc。先启动的为 active

测试 HA 自动切换

$ hdfs haadmin -getServiceState nn1
standby
$ hdfs haadmin -getServiceState nn2
active
$ jps # 因为nn2是活跃的,所以杀掉nn2,查看是否自动切换为nn1
3684 QuorumPeerMain
19748 DFSZKFailoverController
19334 NameNode
19847 DataNode
19207 JournalNode
19961 Jps
$ kill -9 19334
$ hdfs haadmin -getServiceState nn1
active

YARN HA 搭建

修改 yarn-site.xml

node01 node02 node03
ResourceManager ResourceManagerr
NodeManager NodeManager NodeManage
$ vim /opt/hadoop-3.2.3/etc/hadoop/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><property><name>yarn.resourcemanager.ha.rm-ids</name><value>rm1,rm2</value></property><property><name>yarn.resourcemanager.hostname.rm1</name><value>node01</value></property><property><name>yarn.resourcemanager.hostname.rm2</name><value>node03</value></property><!--指定zookeeper集群的地址--> <property><name>yarn.resourcemanager.zk-address</name><value>node01:2181,node02:2181,node03: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>
</configuration>
$ xsync /opt/hadoop-3.2.3/etc/hadoop/yarn-site.xml

修改 start-yarn.sh 和 stop-yarn.sh

$ vim /opt/hadoop-3.2.3/sbin/start-yarn.sh # stop-yarn.sh 同理
# 开头添加以下内容
YARN_RESOURCEMANAGER_USER=root
YARN_NODEMANAGER_USER=root$ xsync /opt/hadoop-3.2.3/sbin/start-yarn.sh

YARN 集群启动

$ start-yarn.sh
# 以下为YARN HA自动切换测试
$ yarn rmadmin -getServiceState rm1
standby
$ yarn rmadmin -getServiceState rm2
active
$ jps # 因为rm2是活跃的,所以杀掉rm2,查看是否自动切换为rm1
11264 DataNode
12852 JournalNode
16040 ResourceManager
16201 NodeManager
16281 Jps
3167 QuorumPeerMain
$ kill -9 16040
$ yarn rmadmin -getServiceState rm1
active

在其余节点使用 yarn --daemon start nodemanager 启动 Node Manager

配置历史服务器

修改 mapred-site.xml

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

添加以下内容

<property><name>mapreduce.jobhistory.address</name><value>node01:10020</value>
</property><property><name>mapreduce.jobhistory.webapp.address</name><value>node01:19888</value>
</property><property><name>mapreduce.jobhistory.done-dir</name><value>/history/done</value>
</property><property><name>mapreduce.jobhistory.intermediate-done-dir</name><value>/history/done_intermediate</value>
</property>
$ xsync $HADOOP_HOME/etc/hadoop/mapred-site.xml

修改 yarn-site.xml

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

添加以下内容

<!--开启日志聚集功能-->
<property><name>yarn.log-aggregation-enable</name><value>true</value>
</property><!--设置日志聚集服务器地址-->
<property><name>yarn.log.server.url</name><value>http://node01:19888/jobhistory/logs</value>
</property><!--设置日志保留时间为7天-->
<property><name>yarn.log-aggregation.retain-seconds</name><value>604800</value>
</property>
$ xsync $HADOOP_HOME/etc/hadoop/yarn-site.xml

启动历史服务器

$ stop-all.sh
$ start-all.sh
$ mr-jobhistory-daemon.sh start historyserver

最终验证

最终效果如下,说明 Hadoop HA 启动成功

$ xcall jps
---------------- node01 ----------------
2304 DataNode
2549 JournalNode
2789 DFSZKFailoverController
3239 ResourceManager
2137 NameNode
4426 Jps
3419 NodeManager
1390 QuorumPeerMain
---------------- node02 ----------------
1376 QuorumPeerMain
2258 DFSZKFailoverController
1910 NameNode
3130 DataNode
3595 Jps
3356 NodeManager
2063 JournalNode
---------------- node03 ----------------
3351 NodeManager
1369 QuorumPeerMain
1916 JournalNode
3820 Jps
2078 ResourceManager
3663 DataNode
--------------- complete ---------------

Hadoop HA 搭建相关推荐

  1. Hadoop HA 搭建(三台主机)

    Hadoop HA 搭建 搭建准备 安装步骤 一.关闭防火墙 二.解压组件 三.配置文件 四.环境变量 五.发送到其他两个节点 六.初始化HDFS 七.启动Hadoop 启动结果 搭建准备 Cento ...

  2. Hadoop ha搭建

    windows软件 必须从G盘加载一个文件 conf xml linux/a /b /c /d /e /f /gmount /g -> disk:G分区 /b -> disk:B分区软件 ...

  3. hadoop ha搭建 namenode格式化失败等错误

    简单来说,按照官方配置即可,但是要足够细心配置xml文件 先贴自己虚拟机搭建namenode格式化错误 昨晚搜索了一下没找到确定的解决办法,决定是配置文件的原因,自己早上去官网看了下配置文件 我的hd ...

  4. Hadoop HA+Federation 高可用联邦模式搭建指南

    为什么80%的码农都做不了架构师?>>>    简述 Hadoop 集群一共有4种部署模式,详见<Hadoop 生态圈介绍>. HA联邦模式解决了单纯HA模式的性能瓶颈( ...

  5. [Hadoop基础]-- Hadoop namenode的HA搭建

    基本架构如下 1\\准备机器h15.h16.h17.h18 将zookeeper文件复制到h15\h16\h17上,并且解压 说明如下:zookeeper-3.4.6/zookeeper-3.4.6/ ...

  6. 【Hadoop HA】搭建Hadoop HA的详细教程

    搭建Hadoop HA的详细教程 前置工作 配置host文件 ssh免密登录 JDK的配置 ZooKeeper配置 Hadoop HA配置文件 core-site.xml hdfs-site.xml ...

  7. Hadoop HA 高可用集群搭建

    Hadoop HA 高可用集群搭建 一.首先配置集群信息 1 vi /etc/hosts 二.安装zookeeper 1.解压至/usr/hadoop/下 1 tar -zxvf zookeeper- ...

  8. (超详细)基于Zookeeper的Hadoop HA集群的搭建

    基于Zookeeper的Hadoop HA集群的搭建 JunLeon--go big or go home 前言: 高可用(high availability,HA)指的是若当前工作中的机器宕机了,系 ...

  9. Hadoop HA高可用集群搭建(Hadoop+Zookeeper+HBase)

    一.服务器环境 主机名 IP 用户名 密码 安装目录 master 192.168.142.124 root xxx /usr/hadoop-2.6.5/ slave1 192.168.142.125 ...

  10. Hadoop 00_hadoop伪分布式,完全分布式,HA搭建

    伪分布式 (single node setup) --------------------------- 安装jdk.配置环境变量,测试 rpm -i jdk-7u67-linux-x64.rpm c ...

最新文章

  1. 使用 EasyPOI 优雅导出Excel模板数据(含图片)
  2. 皮尔·卡丹的管理思想精髓:从小做到大
  3. 信息系统项目管理师-挣值管理(PV、 AC、 EV、 ETC、 CV、 SV、 CPI、 SP)
  4. fail2ban安全设置
  5. GDCM:gdcm::EquipmentManufacturer的测试程序
  6. bulk of the 用法_代词的用法详解:第三部分(不定代词)
  7. 如何在Kaggle 首战中进入前 10%
  8. java redis工具类_redis Java工具类详解
  9. 快速创建一个 spring mvc 示例
  10. 微软终于屈服和妥协:宣布加入 OpenJDK,贡献构建Java生态
  11. 向传奇致敬,向约翰·纳什和他的妻子艾丽西亚致敬,缔造了数学和爱的传奇
  12. 聚播群控微信二次开发sdk完整API
  13. 帅某---考研---高数笔记---汤家凤---第十章向量代数与空间几何
  14. uniapp微信小程序打电话
  15. GAMS系列分享14——综合能源系统——CHP机组运行区域
  16. Python抓取糗事百科成人版图片
  17. oracle evaluate,ORACLE VERSIONS 用法 | 学步园
  18. python点到线段的最小距离
  19. 检测和处理异常值的极简指南
  20. 985中南大学,招生目录新增大数据研究院,包含多个专业!

热门文章

  1. 姐妹素数java_Java之姐妹素数
  2. Sinew探索金融衍生品领域,增强金融市场流动性
  3. 硬件设计18之什么是VGA?
  4. [Android 4.4.3] 泛泰A870 Mokee4.4.3 20140610 RC2.0 通过刷第三版 by syhost
  5. 快速消除Word文档中空格
  6. c++打印心形_c语言如何打印心
  7. “知乎精英”怎么就成了骂人的词
  8. B. Silly Mistake(模拟、思维)
  9. 松翰单片机之汇编编程
  10. Undefined function or variable. The first assignment to a local variable determin its class.