
4.2 HDFS体系结构
4.2.1 HDFS架构概述
HDFS采用主从(Master/Slave)架构模型,分为NameNode(名称节点)、SecondaryNameNode(第二名称节点)、DataNode(数据节点)这几个角色(遵从中国读者习惯,本文混用这3个中英文术语),如图4-1所示。

图4-1
一个典型的HDFS集群是由一个NameNode、一个SecondaryNameNode和若干个DataNode(通常大于3个)组成的,通常是一个节点一个机器,它来管理对应节点的存储。
(1)NameNode:主要负责文件系统命名空间的管理、存储文件目录的Metadata元数据信息,主要包括文件目录、block块和文件对应关系,以及block块和DataNode数据节点的对应关系。
(2)SecondaryNameNode:是NameNode的冷备份,用来减少NameNode的工作量。
(3)DataNode:负责存储客户端(Client)发来的Block数据块,执行数据块的读写操作。
4.2.2 HDFS命名空间管理
HDFS的命名空间包含目录、文件和块。在HDFS1.0架构中,在整个HDFS集群中只有一个命名空间,并且只有唯一一个NameNode,负责对这个命名空间进行管理。HDFS使用的是传统的分级文件体系,因此用户可以像使用普通文件系统一样创建、删除目录和文件以及在目录间移动文件、重命名文件等。HDFS2.0新特性federation联邦功能支持多个命名空间,并且允许在HDFS中同时存在多个NameNode。
4.2.3 NameNode
HDFS集群的命名空间是由NameNode来存储的。NameNode使用FsImage和EditLog两个核心的数据结构,如图4-2所示。EditLog事务日志文件记录每一个对文件系统元数据的改变,如在HDFS中创建一个新的文件,名称节点将会在EditLog中插入一条记录来记录这个改变。整个命名空间的信息包括文件块的映射表等都存放在FsImage文件中。

图4-2
名称节点启动时,它将从磁盘中读取FsImage和EditLog,将EditLog中的所有事务应用到FsImage,然后将新的FsImage刷新到本地磁盘中,因为事务已经被处理并已经持久化到FsImage中,然后就可以截去旧的EditLog。这个过程叫作检查点。
FsImage和Editlog是HDFS的重要数据结构,如果这些文件损坏,就会导致整个集群的失效。因此可以配置成复制多个FsImage和EditLog的副本,一般会在本地磁盘和网络文件系统NFS中分别存放。
4.2.4 SecondaryNameNode
SecondaryNameNode是HDFS架构中的一个组成部分,它用来保存名称节点中对HDFS元数据信息的备份,减小Editlog文件大小,从而缩短名称节点重启的时间。它一般是单独运行在一台机器上。
SecondaryNameNode让EditLog变小的工作流程如下(见图4-3):
(1)SecondaryNameNode会定期和NameNode通信,请求其停止使用EditLog文件,暂时将新的写操作写到一个新的文件edit.new中,这个操作是瞬间完成的,上层写日志的函数完全感觉不到差别。
(2)SecondaryNameNode通过HTTP GET方式从NameNode上获取到FsImage和EditLog文件,并下载到本地的相应目录下。
(3)SecondaryNameNode将下载下来的FsImage载入到内存,然后一条一条地执行EditLog文件中的各项更新操作,使内存中的FsImage保持最新。这个过程就是EditLog和FsImage文件合并。
(4)SecondaryNameNode执行完(3)操作之后,会通过post方式将新的FsImage文件发送到NameNode节点上。
(5)NameNode将从SecondaryNameNode接收到的新的FsImage替换旧的FsImage文件,同时将Edit.new替换EditLog文件,从而减小EditLog文件大小。

图4-3
从上面的过程可以看出,第二名称节点相当于为名称节点设置一个“检查点”,周期性备份名称节点中的元数据信息,但第二名称节点在HDFS设计中只是一个冷备份,并不能起到“热备份”的作用。HDFS设计并不支持当名称节点故障时直接切换到第二名称节点。