Hadoop框架:HDFS高可用环境配置
本文源码:GitHub·点这里 || GitEE·点这里
一、HDFS高可用
1、基础描述
在单点或者少数节点故障的情况下,集群还可以正常的提供服务,HDFS高可用机制可以通过配置Active/Standby两个NameNodes节点实现在集群中对NameNode的热备来消除单节点故障问题,如果单个节点出现故障,可通过该方式将NameNode快速切换到另外一个节点上。
2、机制详解

- 基于两个NameNode做高可用,依赖共享Edits文件和Zookeeper集群;
 - 每个NameNode节点配置一个ZKfailover进程,负责监控所在NameNode节点状态;
 - NameNode与ZooKeeper集群维护一个持久会话;
 - 如果Active节点故障停机,ZooKeeper通知Standby状态的NameNode节点;
 - 在ZKfailover进程检测并确认故障节点无法工作后;
 - ZKfailover通知Standby状态的NameNode节点切换为Active状态继续服务;
 
ZooKeeper在大数据体系中非常重要,协调不同组件的工作,维护并传递数据,例如上述高可用下自动故障转移就依赖于ZooKeeper组件。
二、HDFS高可用
1、整体配置
| 服务列表 | HDFS文件 | YARN调度 | 单服务 | 共享文件 | Zk集群 | 
|---|---|---|---|---|---|
| hop01 | DataNode | NodeManager | NameNode | JournalNode | ZK-hop01 | 
| hop02 | DataNode | NodeManager | ResourceManager | JournalNode | ZK-hop02 | 
| hop03 | DataNode | NodeManager | SecondaryNameNode | JournalNode | ZK-hop03 | 
2、配置JournalNode
创建目录
[root@hop01 opt]# mkdir hopHA
拷贝Hadoop目录
cp -r /opt/hadoop2.7/ /opt/hopHA/
配置core-site.xml
<configuration>
    <!-- NameNode集群模式 -->
	<property>
		<name>fs.defaultFS</name>
       	<value>hdfs://mycluster</value>
	</property>
	<!-- 指定hadoop运行时产生文件的存储目录 -->
	<property>
		<name>hadoop.tmp.dir</name>
	   <value>/opt/hopHA/hadoop2.7/data/tmp</value>
	</property>
</configuration>
配置hdfs-site.xml,添加内容如下
<!-- 分布式集群名称 -->
<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>hop01:9000</value>
</property>
<!-- NN2 RPC通信地址 -->
<property>
	<name>dfs.namenode.rpc-address.mycluster.nn2</name>
	<value>hop02:9000</value>
</property>
<!-- NN1 Http通信地址 -->
<property>
	<name>dfs.namenode.http-address.mycluster.nn1</name>
	<value>hop01:50070</value>
</property>
<!-- NN2 Http通信地址 -->
<property>
	<name>dfs.namenode.http-address.mycluster.nn2</name>
	<value>hop02:50070</value>
</property>
<!-- 指定NameNode元数据在JournalNode上的存放位置 -->
<property>
	<name>dfs.namenode.shared.edits.dir</name>
    <value>qjournal://hop01:8485;hop02:8485;hop03: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>/root/.ssh/id_rsa</value>
</property>
<!-- 声明journalnode服务器存储目录-->
<property>
	<name>dfs.journalnode.edits.dir</name>
	<value>/opt/hopHA/hadoop2.7/data/jn</value>
</property>
<!-- 关闭权限检查-->
<property>
	<name>dfs.permissions.enable</name>
	<value>false</value>
</property>
<!-- 访问代理类失败自动切换实现方式-->
<property>
	<name>dfs.client.failover.proxy.provider.mycluster</name>
    <value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value>
</property>
依次启动journalnode服务
[root@hop01 hadoop2.7]# pwd
/opt/hopHA/hadoop2.7
[root@hop01 hadoop2.7]# sbin/hadoop-daemon.sh start journalnode
删除hopHA下数据
[root@hop01 hadoop2.7]# rm -rf data/ logs/
NN1格式化并启动NameNode
[root@hop01 hadoop2.7]# pwd
/opt/hopHA/hadoop2.7
bin/hdfs namenode -format
sbin/hadoop-daemon.sh start namenode
NN2同步NN1数据
[root@hop02 hadoop2.7]# bin/hdfs namenode -bootstrapStandby
NN2启动NameNode
[root@hop02 hadoop2.7]# sbin/hadoop-daemon.sh start namenode
查看当前状态

在NN1上启动全部DataNode
[root@hop01 hadoop2.7]# sbin/hadoop-daemons.sh start datanode
NN1切换为Active状态
[root@hop01 hadoop2.7]# bin/hdfs haadmin -transitionToActive nn1
[root@hop01 hadoop2.7]# bin/hdfs haadmin -getServiceState nn1
active

3、故障转移配置
配置hdfs-site.xml,新增内容如下,同步集群
<property>
	<name>dfs.ha.automatic-failover.enabled</name>
	<value>true</value>
</property>
配置core-site.xml,新增内容如下,同步集群
<property>
	<name>ha.zookeeper.quorum</name>
	<value>hop01:2181,hop02:2181,hop03:2181</value>
</property>
关闭全部HDFS服务
[root@hop01 hadoop2.7]# sbin/stop-dfs.sh
启动Zookeeper集群
/opt/zookeeper3.4/bin/zkServer.sh start
hop01初始化HA在Zookeeper中状态
[root@hop01 hadoop2.7]# bin/hdfs zkfc -formatZK
hop01启动HDFS服务
[root@hop01 hadoop2.7]# sbin/start-dfs.sh
NameNode节点启动ZKFailover
这里hop01和hop02先启动的服务状态就是Active,这里先启动hop02。
[hadoop2.7]# sbin/hadoop-daemon.sh start zkfc

结束hop02的NameNode进程
kill -9 14422
等待一下查看hop01状态
[root@hop01 hadoop2.7]# bin/hdfs haadmin -getServiceState nn1
active
三、YARN高可用
1、基础描述

基本流程和思路与HDFS机制类似,依赖Zookeeper集群,当Active节点故障时,Standby节点会切换为Active状态持续服务。
2、配置详解
环境同样基于hop01和hop02来演示。
配置yarn-site.xml,同步集群下服务
<configuration>
    <property>
        <name>yarn.nodemanager.aux-services</name>
        <value>mapreduce_shuffle</value>
    </property>
    <!--启用HA机制-->
    <property>
        <name>yarn.resourcemanager.ha.enabled</name>
        <value>true</value>
    </property>
    <!--声明Resourcemanager服务-->
    <property>
        <name>yarn.resourcemanager.cluster-id</name>
        <value>cluster-yarn01</value>
    </property>
    <property>
        <name>yarn.resourcemanager.ha.rm-ids</name>
        <value>rm1,rm2</value>
    </property>
    <property>
        <name>yarn.resourcemanager.hostname.rm1</name>
        <value>hop01</value>
    </property>
    <property>
        <name>yarn.resourcemanager.hostname.rm2</name>
        <value>hop02</value>
    </property>
    <!--Zookeeper集群的地址-->
    <property>
        <name>yarn.resourcemanager.zk-address</name>
        <value>hop01:2181,hop02:2181,hop03:2181</value>
    </property>
    <!--启用自动恢复机制-->
    <property>
        <name>yarn.resourcemanager.recovery.enabled</name>
        <value>true</value>
    </property>
    <!--指定状态存储Zookeeper集群-->
    <property>
        <name>yarn.resourcemanager.store.class</name>     <value>org.apache.hadoop.yarn.server.resourcemanager.recovery.ZKRMStateStore</value>
    </property>
</configuration>
重启journalnode节点
sbin/hadoop-daemon.sh start journalnode
在NN1服务格式化并启动
[root@hop01 hadoop2.7]# bin/hdfs namenode -format
[root@hop01 hadoop2.7]# sbin/hadoop-daemon.sh start namenode
NN2上同步NN1元数据
[root@hop02 hadoop2.7]# bin/hdfs namenode -bootstrapStandby
启动集群下DataNode
[root@hop01 hadoop2.7]# sbin/hadoop-daemons.sh start datanode
NN1设置为Active状态
先启动hop01即可,然后启动hop02。
[root@hop01 hadoop2.7]# sbin/hadoop-daemon.sh start zkfc
hop01启动yarn
[root@hop01 hadoop2.7]# sbin/start-yarn.sh
hop02启动ResourceManager
[root@hop02 hadoop2.7]# sbin/yarn-daemon.sh start resourcemanager
查看状态
[root@hop01 hadoop2.7]# bin/yarn rmadmin -getServiceState rm1

四、源代码地址
GitHub·地址
https://github.com/cicadasmile/big-data-parent
GitEE·地址
https://gitee.com/cicadasmile/big-data-parent
推荐阅读:编程体系整理
| 序号 | 项目名称 | GitHub地址 | GitEE地址 | 推荐指数 | 
|---|---|---|---|---|
| 01 | Java描述设计模式,算法,数据结构 | GitHub·点这里 | GitEE·点这里 | ☆☆☆☆☆ | 
| 02 | Java基础、并发、面向对象、Web开发 | GitHub·点这里 | GitEE·点这里 | ☆☆☆☆ | 
| 03 | SpringCloud微服务基础组件案例详解 | GitHub·点这里 | GitEE·点这里 | ☆☆☆ | 
| 04 | SpringCloud微服务架构实战综合案例 | GitHub·点这里 | GitEE·点这里 | ☆☆☆☆☆ | 
| 05 | SpringBoot框架基础应用入门到进阶 | GitHub·点这里 | GitEE·点这里 | ☆☆☆☆ | 
| 06 | SpringBoot框架整合开发常用中间件 | GitHub·点这里 | GitEE·点这里 | ☆☆☆☆☆ | 
| 07 | 数据管理、分布式、架构设计基础案例 | GitHub·点这里 | GitEE·点这里 | ☆☆☆☆☆ | 
| 08 | 大数据系列、存储、组件、计算等框架 | GitHub·点这里 | GitEE·点这里 | ☆☆☆☆☆ | 
Hadoop框架:HDFS高可用环境配置的更多相关文章
- HDFS 高可用分布式环境搭建
		
HDFS 高可用分布式环境搭建 作者:Grey 原文地址: 博客园:HDFS 高可用分布式环境搭建 CSDN:HDFS 高可用分布式环境搭建 首先,一定要先完成分布式环境搭建 并验证成功 然后在 no ...
 - 大数据学习(07)——Hadoop3.3高可用环境搭建
		
前面用了五篇文章来介绍Hadoop的相关模块,理论学完还得操作一把才能加深理解.这一篇我会花相当长的时间从环境搭建开始,到怎么在使用Hadoop,逐步介绍Hadoop的使用. 本篇分这么几段内容: 规 ...
 - 使用KeepAlived搭建MySQL高可用环境
		
使用KeepAlived搭建MySQL的高可用环境.首先搭建MySQL的主从复制在Master开启binlog,创建复制帐号,然后在Slave输入命令 2016年7月25日 配置安装技巧: ...
 - Jumpserver双机高可用环境部署笔记
		
之前在IDC部署了Jumpserver堡垒机环境,作为登陆线上服务器的统一入口.后面运行一段时间后,发现Jumpserver服务器的CPU负载使用率高达80%以上,主要是python程序对CPU的消耗 ...
 - Haproxy+Keepalived高可用环境部署梳理(主主和主从模式)
		
Nginx.LVS.HAProxy 是目前使用最广泛的三种负载均衡软件,本人都在多个项目中实施过,通常会结合Keepalive做健康检查,实现故障转移的高可用功能. 1)在四层(tcp)实现负载均衡的 ...
 - LVS+Keepalived 高可用环境部署记录(主主和主从模式)
		
之前的文章介绍了LVS负载均衡-基础知识梳理, 下面记录下LVS+Keepalived高可用环境部署梳理(主主和主从模式)的操作流程: 一.LVS+Keepalived主从热备的高可用环境部署 1)环 ...
 - redis-3.0.1 sentinel 主从高可用 详细配置
		
最近项目上线部署,要求redis作高可用,由于redis cluster还不是特别成熟,就选择了redis sentinel做高可用.redis本身有replication,实现主从备份.结合sent ...
 - 阶段5 3.微服务项目【学成在线】_day09 课程预览 Eureka Feign_03-Eureka注册中心-搭建Eureka高可用环境
		
1.3.2.2 高可用环境搭建 Eureka Server 高可用环境需要部署两个Eureka server,它们互相向对方注册.如果在本机启动两个Eureka需要 注意两个Eureka Server ...
 - Eureka高可用环境搭建
		
1.创建govern-center 子工程 包结构:com.dehigher.govern.center 2.pom文件 (1)父工程pom,用于依赖版本管理 <dependencyManage ...
 
随机推荐
- Mybatis的几种传参方式,你了解吗?
			
持续原创输出,点击上方蓝字关注我 目录 前言 单个参数 多个参数 使用索引[不推荐] 使用@Param 使用Map POJO[推荐] List传参 数组传参 总结 前言 前几天恰好面试一个应届生,问了 ...
 - Laravel驱动管理类Manager的分析和使用
			
Laravel驱动管理类Manager的分析和使用 第一部分 概念说明 第二部分 Illuminate\Support\Manager源码 第三部分 Manager类的使用 第一部分:概念解释 结合实 ...
 - MySQL分区 (分区介绍与实际使用)
			
分区介绍: 一.什么是分区? 所谓分区,就是将一个表分成多个区块进行操作和保存,从而降低每次操作的数据,提高性能.而对于应用来说则是透明的,从逻辑上看只有一张表,但在物理上这个表可能是由多个物理分区组 ...
 - thinkphp上传图片,生成缩略图
			
Image.php <?php /** * 实现图片上传,图片缩小, 增加水印 * 需要定义以下常量 * define('ERR_INVALID_IMAGE', 1); * define('ER ...
 - Python  中的是那种路径
			
1.1 操作系统文件绝对路径 django 静态文件查找, 模板查找(第一种) # 去配置好的 文件夹 中查找指定的文件 BASE_DIR = os.path.dirname(os.path.di ...
 - Centos-上传下载文件-rz sz
			
依赖: ssh协议.远程终端 .lrzsz软件包.window操作系统 安装 lrzsz 软件包 yum install -y lrzsz 下载命令 sz sz fileName 上传命令 rz 相关 ...
 - 操作系统:x86下内存分页机制 (1)
			
前置知识: 分段的概念(当然手写过肯定是坠吼的 为什么要分页 当我们写程序的时候,总是倾向于把一个完整的程序分成最基本的数据段,代码段,栈段.并且普通的分段机制就是在进程所属的LDT中把每一个段给标识 ...
 - 剑指offer-链表&数组
			
1.圆圈中最后剩下的数 每年六一儿童节,牛客都会准备一些小礼物去看望孤儿院的小朋友,今年亦是如此.HF作为牛客的资深元老,自然也准备了一些小游戏.其中,有个游戏是这样的:首先,让小朋友们围成一个大圈. ...
 - Python练习题 023:比后面的人大2岁
			
[Python练习题 023] 有5个人坐在一起,问第五个人多少岁?他说比第4个人大2岁.问第4个人岁数,他说比第3个人大2岁.问第三个人,又说比第2人大两岁.问第2个人,说比第一个人大两岁.最后 问 ...
 - 引用类型之Object
			
引用类型 引用类的值(对象)是引用类型的一个实例.在ECMAScript中,引用类型是一种数据结构,用于将数据和功能组织在一起. 对象是某个特定引用类型的实例.新对象是使用new操作符后跟一个构造函数 ...