1. Hadoop 2.0 产生背景
- Hadoop 1.0中HDFS和MapReduce在高可用、扩展性等方面存在问题
- HDFS存在的问题
- NameNode单点故障,难以应用于在线场景 HA
- NameNode压力过大,且内存受限,影扩展性 Federation
- MapReduce存在的问题响
- JobTracker访问压力大,影响系统扩展性
- 难以支持除MapReduce之外的计算框架,比如Spark、Storm等
2. Hadoop 1.x 和Hadoop 2.x
Hadoop 2.x由HDFS、MapReduce和YARN三个分支构成:
- HDFS:NN Federation(联邦)、HA。2.X:只支持2个节点HA,3.0实现了一主多备
- MapReduce:运行在YARN上的MR;
- 离线计算,基于磁盘I/O计算
- YARN,资源管理系统
2.1 HDFS 2.x
- 解决HDFS 1.0中单点故障和内存受限问题。
- 解决单点故障
- HDFS HA:通过主备NameNode解决
- 如果主NameNode发生故障,则切换到备NameNode上
- 解决内存受限问题
- HDFS Federation(联邦)
- 水平扩展,支持多个NameNode;
- (2)每个NameNode分管一部分目录;
- (1)所有NameNode共享所有DataNode存储资源
- 2.x仅是架构上发生了变化,使用方式不变
- 对HDFS使用者透明
- HDFS 1.x中的命令和API仍可以使用
3. HDFS 2.x Federation(联邦)
通过多个namenode/namespace把元数据的存储和管理分散到多个节点中,使到namenode/namespace可以通过增加机器来进行水平扩展。
能把单个namenode的负载分散到多个节点中,在HDFS数据规模较大的时候不会也降低HDFS的性能。可以通过多个namespace来隔离不同类型的应用,把不同类型应用的HDFS元数据的存储和管理分派到不同的namenode中。
4. HDFS 2.x HA(高可用)
主备NameNode
Hadoop HA主要是解决NameNode单点故障问题,主NameNode对外提供服务,备NameNode同步主NameNode元数据,以待切换。所有DataNode同时向两个NameNode汇报数据块信息(位置)。并且在Hadoop HA中还含有JNN集群用来存储共享存储状态(shared edits文件)。处于StandyBy节点的NameNode,主要作用是完成了edits.log文件的合并产生新的image,推送回给Active NameNode。该步骤和SecondaryNameNode的备份功能类似,通过这种方式保证了StandyBy节点的NameNode和Actvie NameNode的fsimage文件一致。edit文件通过JNN集群存储共享存储状态,active namenode处理所有的操作请求(读写),读写入到这个共享状态的集群节点。
HDFS HA保持NameNode元数据信息一致,也就是说保持fsimge和edits文件保持一致。fsimge和edits文件在HDFS 格式化之后产生。
Hadoop的元数据主要作用是维护HDFS文件系统中文件和目录相关信息。元数据的存储形式主要有3类:内存镜像、磁盘镜像(FSImage)、日志(EditLog)。在Namenode启动时,会加载磁盘镜像到内存中以进行元数据的管理,存储在NameNode内存;磁盘镜像是某一时刻HDFS的元数据信息的快照,包含所有相关Datanode节点文件块映射关系和命名空间(Namespace)信息,存储在NameNode本地文件系统;日志文件记录client发起的每一次操作信息,即保存所有对文件系统的修改操作,用于定期和磁盘镜像合并成最新镜像,保证NameNode元数据信息的完整,存储在NameNode本地和共享存储系统(QJM)中。
4.1 共享存储(shared edits)
active namenode处理所有的操作请求(读写),standby namenode只同步状态datanode会同时向两个namenode发送block报告和心跳当满足一次checkpoint时,standby namenode进行一次合并操作active NN执行任何命名空间的修改都会持久化到一半以上的journalnodes上而Standby NN负责观察edits log的变化,它能够读取从JNs中读取edits信息,并更新其内部的命名空间一旦Active NN出现故障,Standby NN将会保证从JNs中读出了全部的Edits,然后切换成Active状态一次checkpoint过程
4.2 切换机制
- 手动切换:通过命令实现主备之间的切换,可以用HDFS升级等场合
- 自动切换:基于Zookeeper实现
基于Zookeeper自动切换方案
- ZooKeeper Failover Controller:监控NameNode健康状态,
- 当NameNode启动时,会向Zookeeper注册NameNode
- NameNode挂掉后,ZKFC为NameNode竞争锁,获得ZKFC 锁的NameNode变为active