
2.2 HDFS
2.2.1 HDFS体系结构
1.HDFS设计理念
1)低成本:兼容廉价的硬件设备。
2)处理大规模数据:典型文件大小GB-TB级别;关注横向扩展。
3)批量数据访问:批量读而非随机读;关注吞吐量而非响应时间。
4)高容错:副本冗余机制。
5)适应场景:大文件访问;静态数据访问。
6)不适合的场景:存储大量小文件;随机读取,低延迟读取。
2.HDFS体系结构
图2.2给出了HDFS体系结构图。

图2.2 HDFS体系结构
从图2.2中可以看出,HDFS由一个Namenode、一个Secondary NameNode、若干Datanodes和Client组成,采用主从结构,存储的基本单位是块。
如果把HDFS比作一本书,Namenode存储的则是书的目录,Datanode存储的就是书的正文内容,一章是一个文件,一节是一个块,目录称为元数据,目录指明的各章节页码称为映射,用户访问数据,首先要访问Namenode。
(1)块(基本操作单位)
1)HDFS把一个文件被分成多个块,以块作为存储单位,默认一个块为64~128MB。
2)HDFS采用抽象的块概念可以带来以下几个明显的好处:支持大规模文件存储;简化系统设计;适合数据备份。
(2)NameNode(主节点,其结构见图2.3)
1)存储元数据:文件、块与DataNode之间的映射。
2)元数据保存在内存。
3)NameNode由FsImage、EditLog两个文件组成。FsImage保存文件、块的目录结构;EditLog保存对文件、块的操作,如创建、删除等。
4)在NameNode统一调度下进行数据块的创建、删除和复制等操作。
(3)DataNode(从节点)
1)存储文件内容。
2)文件内容保存在磁盘上。

图2.3 NameNode结构
3)维护Block ID到DataNode本地文件的映射关系。
4)向名称节点定期发送自己所存储的块的列表(心跳)。
(4)Secondary NameNode(冷备份)
冷备份过程如图2.4所示。

图2.4 Secondary NameNode冷备份过程
Step1:Secondary NameNode会定期和NameNode通信,请求其停止使用EditLog文件,暂时将新的写操作写到一个新的文件edit.new上,这个操作是瞬间完成的,上层写日志的函数完全感觉不到差别。
Step2:Secondary NameNode通过HTTP GET方法从NameNode上获取到FsImage和EditLog文件,并下载到本地的相应目录下。
Step3:Secondary NameNode将下载下来的FsImage载入内存,然后一条一条地执行EditLog文件中的各项更新操作,使得内存中的FsImage保持最新;这个过程就是EditLog和FsImage文件合并。
Step4:Secondary NameNode执行完Step3操作之后,会通过post方法将新的FsImage文件发送到NameNode节点上。
Step5:NameNode将从Secondary NameNode接收到的新的FsImage替换旧的FsImage文件,同时将edit.new替换EditLog文件,通过这个过程EditLog就变小了。