HDFS的组成与架构

HDFS的组成架构图及各部分功能如下所示:

2.1 NameNode节点

当用户访问数据文件时,为了保证能够读取到每一个数据块, HDFS有一个专门 负责保存文件属性信息的节点,这个节点就是 NameNode 节点(即 名称节点 )。

2.1.1 节点职责

NameNode节点 是HDFS的管理者,负责保存和管理HDFS的元数据。

其职责有以下三个方面:

① 管理维护HDFS的命名空间

NameNode管理HDFS系统的命名空间,维护文件系统树以及文件系统树中所有文件的元数据。管理这些信息的的文件分别是 edits(操作日志文件) 和 fsimage(命名空间镜像文件) 。

editlog(操作日志):在NameNode启动的情况下,对HDFS进行的各种操作进行记录。(HDFS客户端执行的所有操作都会被记录到editlog文件中,这些文件由edits文件保存)

fsimage:包含HDFS中的元信息(比如修改时间、访问时间、数据块信息等)。

② 管理DataNode上的数据块

负责管理数据块上所有的元数据信息(管理DataNode上数据块的均衡,维持副本数量)。

③ 接收客户端的请求

接收客户端文件上传、下载、创建目录等的请求。

2.2 DataNode节点

HDFS首先把大文件切分成若干个小的数据块,再把这些数据块写入不同的节点,这个 负责保存文件数据的节点就是 DataNode 节点(即 数据节点 )。

2.2.1 节点职责

DataNode节点 负责存储数据,把Block(数据块)以Linux文件的形式保存在磁盘上,并根据Block标识和字节范围来读写块数据。

其职责有以下三个方面:

① 保存数据块

一个数据块会在多个DataNode进行冗余备份(在某一个DataNode最多只有一个备份)。

② 负责客户端对数据块的IO请求

在客户端执行写操作时,DataNode之间会相互通信,保证写操作的一致性。

③ 定期和NameNode进行心跳通信,接受NameNode的指令

如果NameNode节点10分钟没有收到DataNode的心跳信息,就会将其上的数据块复制到其他DataNode节点。

因此,NameNode节点上并不会永久保存DataNode节点上的数据块信息,而是通过与DataNode节点心跳联系的方式,来更新节点上的映射表,以此减轻负担。

问题:HDFS数据块默认大小为128M(Hadoop2.2之前为64M),将HDFS的数据块设置得很大的目的是什么?(传统数据块只有512个字节)

答:为了减少寻址开销,让HDFS的文件传输时间由传输速率决定(如果块设置得足够大,从磁盘 传输数据的时间 会明显大于 定位这个块开始位置 所需的时间)。

2.3 SecondaryNameNode节点

HDFS有一个定期创建命名空间的检查点(CheckPoint)操作的节点,也就是SecondaryNameNode节点(即 第二名称节点)。

出于可靠性考虑,SecondaryNameNode节点与NameNode节点通常运行在不同的机器上,且SecondaryNameNode节点与NameNode节点的内存要一样大。

(如果想了解 SecondaryNameNode 的工作流程,可以参考这篇文章:浅析 SecondaryNameNode 的工作流程 )

问题:一般情况下,一个集群中的SecondaryNameNode节点也是只有一个的原因是什么?

答:因为如果多的话,会增加NameNode的压力,使其忙于元数据的传输/接收、日志的传输/切换,从而导致性能下降;同时,NameNode节点也不支持做并发检查点。

2.3.1 节点职责

SecondaryNameNode节点 定期把NameNode的 fsimage 和 edits 下载到本地,再将它们加载到内存并进行合并,最后把合并后新的 fsimage 返回NameNode (这个过程称为检查点)。

经典问题:NameNode与SecondaryNameNode有没有关系?

SecondaryNameNode节点的工作流程可以参考这篇文章:

其职责有以下两个方面:

① 防止edits过大

定期合并 fsimage 和 edits 文件,使 edits 大小保持在限制范围内。这样做减少了重新启动NameNode时合并 fsimage 和 edits 耗费的时间,从而减少了NameNode启动的时间。

② 做冷备份

对一定范围内数据做快照性备份,在NameNode失效时能恢复部分 fsimage 。

Fsimage和Edits的作用:

fsimage保存了最新的元数据检查点,在HDFS启动时加载fsimage的信息,包含了整个HDFS文件系统的所有目录和文件的信息。

对于文件来说包括了数据块描述信息、修改时间、访问时间等。

对于目录来说包括修改时间、访问权限控制信息(目录所属用户,所在组)等。

editlog主要是在NameNode已经启动情况下对HDFS进行的各种更新操作进行记录,HDFS客户端执行所有的写操作都会被记录到editlog中。

Fsimage,editlog主要用于在集群启动时将集群的状态恢复到关闭前的状态。

为了达到这个目的,集群启动时将Fsimage、editlog加载到内存中,进行合并,合并后恢复完成。

总之:

fsimage上边存储了DataNode上边的数据的块的映射关系以及相关信息

editlog上边存储了DataNode上边的数据的修改,编辑等相关信息。

NameNode和SecondaryNameNode 工作机制:

第一阶段:NameNode启动

第一次启动NameNode格式化后,创建Fsimage和Edits文件如果不是第一次启动,直接加载编辑日志和镜像文件到内存

客户端对元数据进行增删改的请求

NameNode记录操作日志,更新滚动日志

NameNode在内存中对元数据进行增删改

第二阶段:Secondary NameNode工作

Secondary NameNode询问NameNode是否需要CheckPoint直接带回NameNode是否检查结果

Secondary NameNode请求执行CheckPoint

NameNode滚动正在写的Edits日志

将滚动前的编辑日志和镜像文件拷贝到Secondary NameNode

Secondary NameNode加载编辑日志和镜像文件到内存,并合并

生成新的镜像文件fsimage.chkpoint

拷贝fsimage.chkpoint到NameNode

NameNode将fsimage.chkpoint重新命名成fsimage