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基础 ...
随机推荐
- Kubernetes中部署wordpress+mysql(六)
经过前面的内容其实对k8s已经有了服务迁移的能力了,下面这篇文章主要是用来搭建一些后面要用的组件 一.创建wordpress命名空间 kubectl create namespace wordpres ...
- 新年好 takoyaki,期待再次与你相见
一.序 今天是中国农历一年的最后一天,往年都叫年三十,今年没有三十,最后一天是二十九.厨房的柴火味.窗外的鞭炮声还有不远处传来的说笑声,一切都是熟悉味道,新年到了,家乡热闹起来了.平常左邻右舍都是看不 ...
- django之“static”全局设置
1. 首先要配置静态文件路径(这些文件不输入任何app):. # 设置静态文件读取路径(这些静态文件不属于任何app) STATICFILES_DIRS = [ os.path.join(BASE_D ...
- maven 中的工程依赖和层级依赖?
一.什么是工程依赖? 思考问题?1.1一旦开始分模块开发的时候,之前的所有包都会被拆分成一个一个的项目 model mapper service ... 其实mapper需要model的支持,怎么解决 ...
- 从服务之间的调用来看 我们为什么需要Dapr
Dapr 相关的文章我已经写了20多篇了[1] . 当向其他人推荐Dapr 的时候,需要回答的一个问题就是: Dapr 似乎并不是特别令人印象深刻.它提供了一组"构建块",解决了与 ...
- c#代码设计:子类和父类
哭辽,事情是这样的 我想写个产品类用来放点相机参数,想类似这种的使用方式:(时间关系不改了,产品=Zoo,animals=相机) Zoo Zooxx= new Zoo (); Zoo.Animals ...
- 用了这么久 Linux ,才知道这些概念。。。
Linux 和 UNIX 中的文件系统是一个以 / 为根的树状式文件结构,/ 是 Linux 和 UNIX 中的根目录,同样它也是文件系统的起点.所有的文件和目录都位于 / 路径下,包括我们经常听到的 ...
- JVM学习十三 - (复习)HotSpot 虚拟机对象探秘
对象的内存布局 在 HotSpot 虚拟机中,对象的内存布局分为以下 3 块区域: 对象头(Header) 实例数据(Instance Data) 对齐填充(Padding) 对象头 对象头记录了对象 ...
- jdk1.5新特性之------->可变参数
/* jdk1.5新特性之------->可变参数 需求: 定义一个函数做加法功能(函数做几个数据 的加法功能是不确定). 可变参数的格式: 数据类型... 变量名 可变参数要 注意的细节: 1 ...
- 通过版本号来判断用户是否是第一次登陆----By张秀清
@interface AppDelegate () @end @implementation AppDelegate - (BOOL)application:(UIApplication *)appl ...