Hadoop - HA学习笔记
Hadoop HA概述
工作要点
- 通过双NameNode消除单点故障
- 元数据管理方式需要改变:内存中各自保存一份元数据;Edits 日志只有 Active 状态的NameNode节点可以做写操作;两个
NameNode都可以读取 Edits;共享的Edits放在一个共享存储中管理(qjournal 和 NFS 两个主流实现); - 需要一个状态管理功能模块:实现了一个zkfailover ,常驻在每一个 NameNode 所在的节点,每一个 zkfailover 负责监
控自己所在NameNode节点,利用 zk 进行状态标识,当需要进行状态切换时,由 zkfailover来负责切换,切换时需要防止 brain split 现象的发生。 - 必须保证两个 NameNode 之间能够 ssh 无密码登录;
- 隔离(Fence),即同一时刻仅仅有一个 NameNode 对外提供服务
HDSF HA自动故障转移机制

- 使用两个新组件:ZooKeeper,ZKFailoverController(zkfc)进程
- HA依赖于ZooKeeper的以下功能:
- Failure detection,故障检测:集群中的每个 NameNode 在 ZooKe eper 中维护了一个持久会话,如果机器崩溃, ZooKeeper 中的会话将终止, ZooKeeper 通知另一个 NameNode 需要触发故障转移。
- Active NameNode election,现役NameNode选择:ZooKeeper 提供了一个简单的机制用于唯一的选择一个节点为 active 状态。如果目前现役 NameNode 崩溃,另一个节点可能从 ZooKeeper 获得特殊的排外锁以表明它应该成为现役 NameNode。
- zkfc是ZooKeeper的客户端,监视和管理NameNode的状态,每个NameNode运行一个akfc进程,负责:
- Health monitoring,健康检测:使用一个健康检测命令定期的ping与与之在相同主机的NameNode,只要NameNode及时的回复健康状态,zkfc则认为改节点是健康的,认为该节点是健康的。如果该节点崩溃,冻结或进入不健康状态,健康监测器标识该节点为非健康的。
- ZooKeeper session management ,ZooKeeper会话管理:当本地 NameNode是健康的, ZKFC保持一个在 ZooKeeper中打开的会话。如果本地 NameNode 处于 active 状态, ZKFC也保持一个特殊的 znode 锁,该锁使用了 ZooKeeper 对短暂 节点的支持,如果会话终止,锁节点将自动删除。
- ZooKeeper-based election,基于 ZooKeeper 的选择: 如果本地 NameNode 是健康的,且 ZKFC 发现没有其它的
节点当前持有 znode 锁,它将为自己获取该锁。如果成功,则它已经赢得了选择,并负责运行故障转移进程以使它的本地 NameNode 为 A ctive 。故障转移 进程 与前面描述的手动故障转移相似,首先如果必要保护之前的现役 NameNode ,然后本地 NameNode 转换为 Active 状态。
HDFS HA配置
集群规划
| localhost102 | localhost103 | localhost104 |
| NameNode | NameNode | |
| JournalNode | JournalNode | JournalNode |
| DataNode | DataNode | DataNode |
| ZK | ZK | ZK |
| ResourceManager | ResourceManager | |
| NodeManager | NodeManager | NodeManager |
配置ZooKeeper集群
- 解压,创建zkData目录,添加myid文件
- 修改conf/zoo.cfg,添加集群信息server.A=B:C:D,A是节点myid,B是主机名,C是通信端口2888,D是选举端口3888
- 启动集群:bin/zkServer.sh start,启动客户端:bin/zkCli.sh
配置HDFS HA集群(手动故障转移)
- 配置core-site.xml
<!-- 把两个NameNode的地址组装成一个集群mycluster -->
<property>
<name>fs.defaultFS</name>
<value>hdfs://mycluster</value>
</property>
<!-- 指定Hadoop 运行时产生文件的存储目录-->
<property>
<name>hadoop.tmp.dir</name>
<value>/opt/module/HA/hadoop-2.7.2/data/tmp</value>
</property>
<!-- 声明journalnode服务器存储目录-->
<property>
<name>dfs.journalnode.edits.dir</name>
<value>/opt/module/HA/hadoop-2.7.2/data/tmp/jn</value>
</property>
- 配置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>localhost102:8020</value>
</property>
<!-- nn2的RPC通信地址 -->
<property>
<name>dfs.namenode.rpc-address.mycluster.nn2</name>
<value>localhost103:8020</value>
</property>
<!-- nn1的http通信地址 -->
<property>
<name>dfs.namenode.http-address.mycluster.nn1</name>
<value>localhost102:50070</value>
</property>
<!-- nn2的http通信地址 -->
<property>
<name>dfs.namenode.http-address.mycluster.nn2</name>
<value>localhost103:50070</value>
</property>
<!-- 指定NameNode元数据在JournalNode上的存放位置 -->
<property>
<name>dfs.namenode.shared.edits.dir</name>
<value>qjournal://localhost102:8485;localhost103:8485;localhost104:8485/mycluster</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>
<!-- 配置隔离机制,即同一时刻只能有一台服务器对外响应 -->
<property>
<name>dfs.ha.fencing.methods</name>
<value>sshfence</value>
</property>
<!-- 使用隔离机制时需要ssh无秘钥登录-->
<property>
<name>dfs.ha.fencing.ssh.private-key-files</name>
<value>/home/shun/.ssh/id_rsa</value>
</property>
<!-- 关闭权限检查-->
<property>
<name>dfs.permissions.enable</name>
<value>false</value>
</property>
- 启动所有的JournalNode:sbin/hadoop-daemons.sh start journalnodes
- 在nn1上格式化并启动:bin/hdfs namenode -format,启动sbin/hadoop-daemon.sh start namenode
- 在nn2上同步nn1的信息并启动:bin/hdfs namenode -bootstrapStandby,启动:sbin/hadoop-daemon.sh start namenode
- 将nn1或nn2切换成Active状态:启动所有DataNode:sbin/hadoop-daemons.sh start datanode,切换为Active:bin/hdfs haadmin -transitionToActive nn1,查看状态:bin/hdfs haadmin -getServiceState nn1
配置HDFS HA自动故障转移
- 关闭所有HDFS服务:sbin/stop-dfs.sh
- 启动ZooKeeper集群:ZooKeeper目录下:bin/zkServer.sh start
- 配置core-site.xml,ZK地址
<!-- 声明ZooKeeper集群地址-->
<property>
<name>ha.zookeeper.quorum</name>
<value>localhost102:2181,localhost103:2181,localhost104:2181</value>
</property>
- 配置hdfs-site.xml,开启自动故障转移
<!--开启自动故障转移-->
<property>
<name>dfs.ha.automatic-failover.enabled</name>
<value>true</value>
</property>
- 初始化HA在ZK中的状态:bin/hdfs zkfc -formatZK
- 启动HDFS服务:sbin/start-dfs.sh
注意:第一次使用集群时,必须先不打开自动故障转移;启动所有的JournalNode,格式化其中一个NameNode,然后启动,再在另一个NameNode上同步前一个NameNode的信息,开启这个NameNode。然后关闭所有HDFS服务,配置ZK地址、开启自动故障转移,再格式化zkfc,开启所有HDFS服务即可。
nn1和nn2的端口可以是1版本的8020,也可以是9000
YARN HA配置
- 工作机制

- 配置yarn-site.xml,启用HA,声明集群名,两个rm的命名,声明两个rm的地址,ZK地址
<!-- Reducer 获取数据的方式-->
<property>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
</property>
<!-- 日志聚集功能使能-->
<property>
<name>yarn.log-aggregation-enable</name>
<value>true</value>
</property>
<!-- 日志保留时间设置7 天-->
<property>
<name>yarn.log-aggregation.retain-seconds</name>
<value>604800</value>
</property>
<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>localhost102</value>
</property>
<property>
<name>yarn.resourcemanager.hostname.rm2</name>
<value>localhost103</value>
</property>
<!--指定zookeeper集群的地址-->
<property>
<name>yarn.resourcemanager.zk-address</name>
<value>localhost102:2181,localhost103:2181,localhost104:2181</value>
</property>
- 在rm1上开启所有YARN服务:sbin/start-yarn.sh(不会开启rm2的resourcemanager)
- 在rm2上开启resourcemanager:sbin/yarn-daemon.sh start resourcemanager
注意:
sbin/start-yarn.sh只开启本地的resourcemanager和所有的nodemanager,需要在两一个节点开启resourcemanager;
sbin/start-hdfs.sh开启所有节点的DataNode、NameNode、JournalNode、zkfc;
开启/关闭所有节点的单个HDFS进程:sbin/hadoop-daemons.sh start/stop namenode/datanode/journalnode/zkfc
开启/关闭所有节点的单个YARN进程:sbin/yarn-daemons.sh start/stop resourcemanager/nodemanager
单节点启动:sbin/hadoop-daemon.sh,sbin/yarn-daemon.sh
Hadoop - HA学习笔记的更多相关文章
- Hadoop入门学习笔记---part4
紧接着<Hadoop入门学习笔记---part3>中的继续了解如何用java在程序中操作HDFS. 众所周知,对文件的操作无非是创建,查看,下载,删除.下面我们就开始应用java程序进行操 ...
- Hadoop入门学习笔记---part3
2015年元旦,好好学习,天天向上.良好的开端是成功的一半,任何学习都不能中断,只有坚持才会出结果.继续学习Hadoop.冰冻三尺,非一日之寒! 经过Hadoop的伪分布集群环境的搭建,基本对Hado ...
- Hadoop入门学习笔记---part2
在<Hadoop入门学习笔记---part1>中感觉自己虽然总结的比较详细,但是始终感觉有点凌乱.不够系统化,不够简洁.经过自己的推敲和总结,现在在此处概括性的总结一下,认为在准备搭建ha ...
- Hadoop入门学习笔记---part1
随着毕业设计的进行,大学四年正式进入尾声.任你玩四年的大学的最后一次作业最后在激烈的选题中尘埃落定.无论选择了怎样的选题,无论最后的结果是怎样的,对于大学里面的这最后一份作业,也希望自己能够尽心尽力, ...
- Hadoop入门学习笔记(一)
Week2 学习笔记 Hadoop核心组件 Hadoop HDFS(分布式文件存储系统):解决海量数据存储 Hadoop YARN(集群资源管理和任务调度框架):解决资源任务调度 Hadoop Map ...
- Hadoop概括——学习笔记<一>
之前有幸在MOOC学院抽中小象学院hadoop体验课. 这是小象学院hadoop2.X概述第一章的笔记 第一章主要讲的是hadoop基础知识.老师讲的还是比较全面简单的,起码作为一个非专业码农以及数据 ...
- 智传播客hadoop视频学习笔记(共2天)
第一天:1.答疑解惑• 就业前景• 学习hadoop要有什么基础• hadoop会像塞班一样,热一阵子吗• hadoop学习起来容易还是困难• 课堂上的学习方法(所有实验必须按照要求做,重原 ...
- Hadoop入门学习笔记总结系列文章导航
一.为何要学习Hadoop? 这是一个信息爆炸的时代.经过数十年的积累,很多企业都聚集了大量的数据.这些数据也是企业的核心财富之一,怎样从累积的数据里寻找价值,变废为宝炼数成金成为当务之急.但数据增长 ...
- Hadoop概括——学习笔记<一>转
前言 第一章主要讲的是hadoop基础知识.老师讲的还是比较全面简单的,起码作为一个非专业码农以及数据库管理人员,也能狗大致了解其特点 首先是概括图(以hadoop2.0为例) 一.Hadoop基础 ...
随机推荐
- 从容器镜像的选择-alpine 说起
在 容器崛起之前,Alpine 还是个无名之辈,可能是因为大家并不是很关心操作系统本身的大小,毕竟大家只关心业务数据和文档,程序.库文件和系统本身的大小通常可以忽略不计. 容器技术席卷整个软件产业之后 ...
- gin中如何记录日志和错误日志
package main import ( "github.com/gin-gonic/gin" "io" "os" ) func main ...
- golang中往脚本传递参数的两种用法os.Args和flag
1. os.Args package main import ( "fmt" "os" ) func main() { // 执行:./demo.exe 127 ...
- AOP-底层原理(JDK动态代理实现)
AOP(JDK动态代理) 1,使用JDK动态代理,使用Proxy类里面的方法创建代理对象 (1)调用 newProxyInstance 方法 方法有三个参数 第一参数,类加载器 第二参数,增强方法所在 ...
- Flink 如何通过2PC实现Exactly-once语义 (源码分析)
Flink通过全局快照能保证内部处理的Exactly-once语义 但是端到端的Exactly-once还需要下游数据源配合,常见的通过幂等或者二阶段提交这两种方式保证 这里就来分析一下Sink二阶段 ...
- python 小兵(2)
while 条件: 结构体 if=条件: 等于 while 条件: 结构体 else: print(int(Ture)) 1 print(int(False)) 0 切片顾头不顾尾 prin ...
- H264 编解码协议
1.概述 H264是MPEG-4标准所定义的最新编码格式,同时也是技术含量最高.代表最新技术水平的视频编码格式之一,标准写法应该是H.264.H.264视频格式是经过有损压缩的,但是在技术上尽可能做到 ...
- Atcoder ARC-068
A 不难发现从 \(5\) 开始一直往 \(6\) 转再转回来是最优的,直接模拟即可. B 不难发现可以将多余部分直接贪心消去,最后必然会剩下两个或 \(1\) 个多余的数. 如果剩下两个,此时多余的 ...
- js Array.prototype.slice.call(arguments,0) 理解
Array.prototype.slice.call(arguments,0) 经常会看到这段代码用来处理函数的参数 网上很多复制粘帖说:Array.prototype.slice.call(argu ...
- Mac 屏幕录制Gif 制作 By-胡罗
一.视频录制 1)使用Mac系统自带的QuickTime进行屏幕录像 手动打开(如下图) 详细 Mac 基础教程:如何使用 Mac 系统原生的屏幕录制功能 相关快捷键 option+command+n ...