HDFS的HA(高可用)

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

(2)Hadoop2.0 之前,在 HDFS 集群中 NameNode 存在单点故障(SPOF)。

(3)NameNode 主要在以下两个方面影响 HDFS 集群:
a)NameNode 机器发生意外,如宕机,集群将无法使用,直到管理员重启
b)NameNode 机器需要升级,包括软件、硬件升级,此时集群也将无法使用
HDFS HA 功能通过配置 Active/Standby 两个 NameNode实现在集群中对 NameNode 的热备来解决上述问题。
如果出现故障,如机器崩溃或机器需要升级维护,这时可通过此种方式将 NameNode 很快的切换到另外一台机器
HDFS-HA 工作 要点
(1)元数据管理方式需要改变:
内存中各自保存一份元数据;
Edits 日志只有 Active 状态的 namenode 节点可以做写操作;
两个 namenode 都可以读取 edits;
共享的 edits 放在一个共享存储中管理(qjournal 和 NFS 两个主流实现); (2)需要一个状态管理功能模块
实现了一个 zkfailover,常驻在每一个 namenode 所在的节点,每一个 zkfailover 负责监控自己所在 namenode 节点,
利用 zk 进行状态标识,当需要进行状态切换时,由zkfailover 来负责切换,切换时需要防止 brain split 现象的发生。 (3)必须保证两个 NameNode 之间能够 ssh 无密码登录。 (4)隔离(Fence),即同一时刻仅仅有一个 NameNode 对外提供服务
HDFS-HA 自动故障转移工作 机制
	前面学习了使用命令 hdfs haadmin -failover 手动进行故障转移,在该模式下,即使现役NameNode 已经失效,
系统也不会自动从现役 NameNode 转移到待机 NameNode,下面学习如何配置部署 HA 自动进行故障转移。
自动故障转移为 HDFS 部署增加了两个新组件:
ZooKeeper 和 ZKFailoverController(ZKFC)进程。
ZooKeeper 是维护少量协调数据,通知客户端这些数据的改变和监视客户端故障的高可用服务。 HA 的自动故障转移依赖于ZooKeeper 的以下功能:
(1) 故障检测:
集群中的每个 NameNode 在 ZooKeeper 中维护了一个持久会话,如果机器崩溃,ZooKeeper 中的会话将终止,
ZooKeeper 通知另一个 NameNode 需要触发故障转移。
(2) 现役 NameNode 选择:
ZooKeeper 提供了一个简单的机制用于唯一的选择一个节点为 active 状态。
如果目前现役 NameNode 崩溃,另一个节点可以从 ZooKeeper 获得特殊的排外锁以表明它应该成为现役 NameNode。 ZKFC 是自动故障转移中的另一个新组件,是 ZooKeeper 的客户端,也监视和管理NameNode 的状态。
每个运行 NameNode 的主机也运行了一个 ZKFC 进程。
ZKFC 负责:
(1)健康监测:
ZKFC 使用一个健康检查命令定期地 ping 与之在相同主机的 NameNode,只要该 NameNode 及时地回复健康状态,
ZKFC 认为该节点是健康的。如果该节点崩溃,冻结或进入不健康状态,健康监测器标识该节点为非健康的。
(2)ZooKeeper 会话管理:
当本地 NameNode 是健康的,ZKFC 保持一个在 ZooKeeper中打开的会话。
如果本地 NameNode 处于 active 状态,ZKFC 也保持一个特殊的 znode 锁,
该锁使用了 ZooKeeper 对短暂节点的支持,如果会话终止,锁节点将自动删除。
(3)基于 ZooKeeper 的选择:
如果本地 NameNode 是健康的,且 ZKFC 发现没有其它的节点当前持有 znode 锁,
它将为自己获取该锁。如果成功,则它已经赢得了选择,并负责运行故障转移进程以使它的本地 NameNode 为 active。
故障转移进程与前面描述的手动故障转移相似,首先如果必要保护之前的现役 NameNode,
然后本地 NameNode 转换为 active 状态。
HDFS-HA 集群配置
环境准备
(1)修改 IP
(2)修改主机名及主机名和 IP 地址的映射
(3)关闭防火墙
(4)ssh 免密登录
(5)安装 JDK,配置环境变量等
规划集群
	hadoop102				 hadoop103					 hadoop104
NameNode NameNode
JournalNode JournalNode JournalNode
DataNode DataNode DataNode
ZK ZK ZK
ResourceManager
NodeManager NodeManager NodeManager
配置 Zookeeper
(1)在 hadoop102、hadoop103 和 hadoop104 三个节点上部署 Zookeeper
解压安装 (2)在/opt/module/zookeeper-3.4.10/这个目录下创建 zkData
$ mkdir -p zkData (3)重命名/opt/module/zookeeper-3.4.10/conf 这个目录下的 zoo_sample.cfg 为 zoo.cfg
$ mv zoo_sample.cfg zoo.cfg (4)配置 zoo.cfg 文件 dataDir=/opt/module/zookeeper-3.4.10/zkData
#增加如下配置
#######################cluster##########################
server.2=hadoop102:2888:3888
server.3=hadoop103:2888:3888
server.4=hadoop104:2888:3888 (5)配置参数解读
Server.A=B:C:D。
A 是一个数字,表示这个是第几号服务器;
B 是这个服务器的 ip 地址;
C 是这个服务器与集群中的 Leader 服务器交换信息的端口;
D 是万一集群中的 Leader 服务器挂了,需要一个端口来重新进行选举,选出一个新的
Leader,而这个端口就是用来执行选举时服务器相互通信的端口。
集群模式下配置一个文件myid,这个文件在dataDir目录下,这个文件里面有一个数据
就是 A 的值,Zookeeper 启动时读取此文件,拿到里面的数据与 zoo.cfg 里面的配置信息比
较从而判断到底是哪个 server。 (6)在每一个机器上/opt/module/zookeeper-3.4.10/zkData 目录下创建一个 myid 的文件
$ touch myid
(7)编辑 myid 文件
$ vi myid
在文件中添加与 server 对应的编号:如 2 (8)分别启动 zookeeper
$ bin/zkServer.sh start
(9)查看状态
$ bin/zkServer.sh status JMX enabled by default
Using config: /opt/module/zookeeper-3.4.10/bin/../conf/zoo.cfg
Mode: follower/leader (10)在 opt 目录下创建一个 ha 文件夹
$ mkdir ha
(11)将/opt/app/下的 hadoop-2.7.2 拷贝到/opt/ha 目录
$ cp -r hadoop-2.7.2/ /opt/ha/
(12)配置 hadoop-env.sh
export JAVA_HOME=/opt/module/jdk1.8.0_144
(13)配置 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-2.7.2/data/tmp</value>
</property>
</configuration> (14)配置 hdfs-site.xml <configuration>
<!-- 完全分布式集群名称 -->
<property>
<name>dfs.nameservices</name>
<value>mycluster</value>
</property>
<!-- 集群中 NameNode 节点都有哪些 -->
<property>
<name>dfs.ha.namenodes.mycluster</name>
<value>nn1,nn2</value>
</property>
<!-- nn1 的 RPC 通信地址 -->
<property>
<name>dfs.namenode.rpc-address.mycluster.nn1</name>
<value>hadoop102:9000</value>
</property>
<!-- nn2 的 RPC 通信地址 -->
<property>
<name>dfs.namenode.rpc-address.mycluster.nn2</name>
<value>hadoop103:9000</value>
</property>
<!-- nn1 的 http 通信地址 -->
<property>
<name>dfs.namenode.http-address.mycluster.nn1</name>
<value>hadoop102:50070</value>
</property>
<!-- nn2 的 http 通信地址 -->
<property>
<name>dfs.namenode.http-address.mycluster.nn2</name>
<value>hadoop103:50070</value>
</property>
<!-- 指定 NameNode 元数据在 JournalNode 上的存放位置 -->
<property>
<name>dfs.namenode.shared.edits.dir</name>
<value>qjournal://hadoop102:8485;hadoop103:8485;hadoop104:8485/mycluster</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>
<!-- 声明 journalnode 服务器存储目录-->
<property>
<name>dfs.journalnode.edits.dir</name>
<value>/opt/ha/hadoop-2.7.2/data/jn</value>
</property>
<!-- 关闭权限检查-->
<property>
<name>dfs.permissions.enable</name>
<value>false</value>
</property> <!-- 访问代理类:client,mycluster,active 配置失败自动切换实现方式-->
<property>
<name>dfs.client.failover.proxy.provider.mycluster</name>
<value>org.apache.hadoop.hdfs.server.namenode.ha.
ConfiguredFailoverProxyProvider</value>
</property>
</configuration> (15)拷贝配置好的 hadoop 环境到其他节点
(16)启动 HDFS-HA 集群
(17)在各个 JournalNode 节点上,输入以下命令启动 journalnode 服务
$ sbin/hadoop-daemon.sh start journalnode
(18)在[nn1]上,对其进行格式化,并启动:
$ bin/hdfs namenode -format
$ sbin/hadoop-daemon.sh start namenode
(19)在[nn2]上,同步 nn1 的元数据信息:
$ bin/hdfs namenode -bootstrapStandby
(20)启动[nn2]:
$ sbin/hadoop-daemon.sh start namenode
(21)查看 web 页面显示
(22)在[nn1]上,启动所有 datanode
$ sbin/hadoop-daemons.sh start datanode
(23)将[nn1]切换为 Active
$ bin/hdfs haadmin -transitionToActive nn1
(24)查看是否 Active
$ bin/hdfs haadmin -getServiceState nn1 配置 HDFS-HA 自动故障转移
(1)在 hdfs-site.xml 中增加
<property>
<name>dfs.ha.automatic-failover.enabled</name>
<value>true</value>
</property> (2)在 core-site.xml 文件中增加
<property>
<name>ha.zookeeper.quorum</name>
<value>hadoop102:2181,hadoop103:2181,hadoop104:2181</value>
</property>
(3)关闭所有 HDFS 服务
$ sbin/stop-dfs.sh
(4)启动 Zookeeper 集群
$ bin/zkServer.sh start
(5)初始化 HA 在 Zookeeper 中状态
$ bin/hdfs zkfc -formatZK
(6)启动 HDFS 服务
$ sbin/start-dfs.sh
(7)在各个 NameNode 节点上启动 DFSZK Failover Controller,先在哪台机器启动,
哪个机器的 NameNode 就是 Active NameNode
$ sbin/hadoop-daemin.sh start zkfc (8)验证
(a)将 Active NameNode 进程 kill
kill -9 namenode 的进程 id
(b)将 Active NameNode 机器断开网络
service network stop
配置 YARN-HA 集群

(1)环境准备

(1)修改 IP
(2)修改主机名及主机名和 IP 地址的映射
(3)关闭防火墙
(4)ssh 免密登录
(5)安装 JDK,配置环境变量等
(6)配置 Zookeeper 集群

(2)规划集群

hadoop102 			hadoop103 				hadoop104
NameNode NameNode
JournalNode JournalNode JournalNode
DataNode DataNode DataNode
ZK ZK ZK
ResourceManager ResourceManager
NodeManager NodeManager NodeManager

(3)具体配置

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>hadoop102</value>
</property>
<property>
<name>yarn.resourcemanager.hostname.rm2</name>
<value>hadoop103</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>
</configuration>

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

(4)启动 hdfs

(1)在各个 JournalNode 节点上,输入以下命令启动 journalnode 服务:
$ sbin/hadoop-daemon.sh start journalnode
(2)在[nn1]上,对其进行格式化,并启动:
$ bin/hdfs namenode -format
$ sbin/hadoop-daemon.sh start namenode
(3)在[nn2]上,同步 nn1 的元数据信息:
$ bin/hdfs namenode -bootstrapStandby
(4)启动[nn2]:
$ sbin/hadoop-daemon.sh start namenode
(5)启动所有 datanode
$ sbin/hadoop-daemons.sh start datanode
(6)将[nn1]切换为 Active
$ bin/hdfs haadmin -transitionToActive nn1

(5)启动 yarn

(1)在 hadoop102 中执行:
$ sbin/start-yarn.sh
(2)在 hadoop103 中执行:
$ sbin/yarn-daemon.sh start resourcemanager
(3)查看服务状态
$ bin/yarn rmadmin -getServiceState rm1

本博客仅为博主学习总结,感谢各大网络平台的资料。蟹蟹!!

HDFS的HA(高可用)的更多相关文章

  1. Hdfs的HA高可用

    1.Hdfs的HA高可用:保证Hdfs高可用,其实就是保证namenode的高可用,保证namenode的高可用的机制有两个,editlog共享机制+ZKFC.ZKFC就是ZookeeperFailO ...

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

    声明:作者原创,转载注明出处. 作者:帅气陈吃苹果 一.服务器环境 主机名 IP 用户名 密码 安装目录 master188 192.168.29.188 hadoop hadoop /home/ha ...

  3. Hadoop 3.1.2(HA)+Zookeeper3.4.13+Hbase1.4.9(HA)+Hive2.3.4+Spark2.4.0(HA)高可用集群搭建

    目录 目录 1.前言 1.1.什么是 Hadoop? 1.1.1.什么是 YARN? 1.2.什么是 Zookeeper? 1.3.什么是 Hbase? 1.4.什么是 Hive 1.5.什么是 Sp ...

  4. CentOS7+Hadoop2.7.2(HA高可用+Federation联邦)+Hive1.2.1+Spark2.1.0 完全分布式集群安装

    1 2 2.1 2.2 2.3 2.4 2.5 2.6 2.7 2.8 2.9 2.9.1 2.9.2 2.9.2.1 2.9.2.2 2.9.3 2.9.3.1 2.9.3.2 2.9.3.3 2. ...

  5. hadoop 集群HA高可用搭建以及问题解决方案

    hadoop 集群HA高可用搭建 目录大纲 1. hadoop HA原理 2. hadoop HA特点 3. Zookeeper 配置 4. 安装Hadoop集群 5. Hadoop HA配置 搭建环 ...

  6. 大数据Hadoop的HA高可用架构集群部署

        1 概述 在Hadoop 2.0.0之前,一个Hadoop集群只有一个NameNode,那么NameNode就会存在单点故障的问题,幸运的是Hadoop 2.0.0之后解决了这个问题,即支持N ...

  7. HA 高可用集群概述及其原理解析

    HA 高可用集群概述及其原理解析 1. 概述 1)所谓HA(High Available),即高可用(7*24小时不中断服务). 2)实现高可用最关键的策略是消除单点故障.HA严格来说应该分成各个组件 ...

  8. 大数据技术之HA 高可用

    HDFS HA高可用 1.1 HA概述 1)所谓HA(High Available),即高可用(7*24小时不中断服务). 2)实现高可用最关键的策略是消除单点故障.HA严格来说应该分成各个组件的HA ...

  9. Spark入门:第2节 Spark集群安装:1 - 3;第3节 Spark HA高可用部署:1 - 2

    三. Spark集群安装 3.1 下载spark安装包 下载地址spark官网:http://spark.apache.org/downloads.html 这里我们使用 spark-2.1.3-bi ...

  10. Flink 集群搭建,Standalone,集群部署,HA高可用部署

    基础环境 准备3台虚拟机 配置无密码登录 配置方法:https://ipooli.com/2020/04/linux_host/ 并且做好主机映射. 下载Flink https://www.apach ...

随机推荐

  1. Uncaught (in promise)

    Uncaught (in promise) 使用es6的promise时候,有时候会出现如下错误: 这是因为,使用定义promise方法的时候,reject了,但是,在使用的地方没有用catch进行接 ...

  2. 将QT开发的界面程序封装成DLL,在VC中成功调用(必须有消息循环,所以使用了QTWinmigrate,附CSDN可下载的Demo)

    最近手头的一个项目需要做一个QT界面,并且封装成DLL,然后再动态调用DLL给出的接口函数,使封装在DLL内部的QT界面跑起来,在网上查了很多资料,今天终于成功了,经验不敢独享,因为CSDN给了我很多 ...

  3. libjingler-0.6.2在windows和ubuntu 10.04下的编译(Google Talk)

    Libjingle版本:0.6.2 所需的资源:         gtest-1.6.0.zip         http://download.csdn.net/detail/cl_gamer/48 ...

  4. [android自动化构建]之centos安装gradle

    这是android自动化构建系列之环境配置 这里只记录部分gradle相关的配置 下载并解压 下载地址参考这里:https://services.gradle.org/distributions/,未 ...

  5. TDD(测试驱动开发)死了吗?

    01.前言 很早之前,曾在网络上见到过 TDD 这 3 个大写的英文字母,它是 Test Driven Development 这三个单词的缩写,也就是“测试驱动开发”的意思——听起来很不错的一种理念 ...

  6. Sentinel2A影像监测家乡油菜长势!!

    首先当然得为我的家乡打一个广告啊,湖南省衡南县宝盖镇双河口村,非常有名的油菜花种植基地,从下面的图就可以看出来,欢迎各位童鞋前往观光旅游,家乡人民非常nice,非常热情.... 我的老家就住在双河口村 ...

  7. jmeter安装与部署

    1.JDK组件安装 jmeter是一款java开发的测试软件,需要JDK运行环境支持,因此在安装jmeter前需要安装调试好jdk运行环境.jmeter3.2需要1.8以上版本jdk才可以正常运行.首 ...

  8. 工作中vue项目前后端分离,调用后端本地接口出现跨域问题的完美解决

    在我们实际开发中,选择不错的前端框架可以为我们省掉很多时间,当然,有时我们也会遇到很多坑. 最近在做vue项目时就遇到了跨域问题,一般来说,出现跨域我们第一反应使用jsonp,但是这个只支持get请求 ...

  9. JCS学习记录 --Java Caching System

    Java Caching System--JCS 缓存工具 //jcs版本 jcs-1.3.jar //jcs--cache.ccf缓存配置文件 cache.ccf //所依赖的jar包concurr ...

  10. ASP.NET Core on K8S学习初探(3)部署API到K8S

    在上一篇<基本概念快速一览>中,我们把基本的一些概念快速地简单地不求甚解地过了一下,本篇开始我们会将ASP.NET Core WebAPI部署到K8S,从而结束初探的旅程. Section ...