3.3 HDFS文件存储机制
在Hadoop中数据的存储是由HDFS负责的,HDFS是Hadoop分布式计算的存储基石,Hadoop的分布式文件系统和其他分布式文件系统有很多类似的特质。那么HDFS相比于其他的文件系统有什么特征呢?简单总结如下。
1)对于整个集群有单一的命名空间。
2)数据一致性。适合一次写入多次读取的模型,客户端在文件没有被成功创建之前无法看到文件存在。
3)文件会被分割成多个文件块,每个文件块被分配存储到数据节点上,而且根据配置会有复制文件块来保证数据的安全性。
在Hadoop中数据存储涉及HDFS的三个重要角色,分别为:名称节点(NameNode)、数据节点(DataNode)、客户端。
NameNode可以看作是分布式文件系统中的管理者,主要负责管理文件系统的命名空间、集群配置信息、存储块的复制。NameNode会在内存中存储文件系统的Metadata,这些信息主要包括文件信息,即每一个文件对应的文件块的信息,以及每一个文件块在DataNode的信息。
DataNode是负责存储文件数据的节点。HDFS中文件的存储方式是将文件按块(block)切分,默认一个block为64MB(该大小可配置)。若文件大小超过一个block的容量可能会被切分为多个block,并存储在不同的DataNode上;若文件大小小于一个block的容量,则文件只有一个block,实际占用的存储空间为文件大小容量加上一点额外的校验数据。也可以这么说,一个文件至少由一个或多个block组成,而一个block仅属于一个文件。block是一个逻辑概念对象,由DataNode基于本地文件系统来实现。每个block在本地文件系统中由两个文件组成,第一个文件包含文件数据本身,第二个文件则记录block的元信息(Metadata),如数据校验和(checksum)。所以每一个block对象实际物理对应两个文件,但DataNode不会将文件创建在同一个目录下。因为本机文件系统可能不能高效地支持单目录下的大量文件,DataNode会使用启发式方法决定单个目录下存放多少文件合适,并在适当时候创建子目录。
文件数据存储的可靠性依赖多副本保障,对于单一DataNode节点而言只需保证自己存储的block是完整且无损坏的。DataNode会主动周期性地运行一个block扫描器(Scanner)通过比对checksum来检查block是否损坏。另外还有一种被动的检查方式,就是当读取时检查。DataNode是文件存储的基本单元。它将block存储在本地文件系统中,保存了block的Metadata,同时周期性地发送所有存在的block的报告给NameNode。Client(客户端)就是需要获取分布式文件系统文件的应用程序。数据存储中的读取和写入过程如图3-22所示。
图3-22 HDFS存储结构
从图3-22可以看到,数据存储过程中主要通过三个操作来说明NameNode、DataNode、Client之间的交互关系。根据图3-22所示的内容简单分析一下Hadoop存储中数据写入和读取访问的基本流程。
1.文件读取HDFS的基本流程(详细过程查看3.4.1节)
1)Client向NameNode发起文件读取的请求。
2)NameNode返回文件存储的DataNode的信息。
3)Client读取文件信息。
2.文件写入HDFS的基本流程(详细过程查看3.4.2节)
1)Client向NameNode发起文件写入的请求。
2)NameNode根据文件大小和文件块配置情况,向Client返回它所管理的DataNode的信息。
3)Client将文件划分为多个block,根据DataNode的地址信息,按顺序写入每一个DataNode中。
3.在HDFS中复制文件块的基本流程
1)NameNode发现部分文件的block不符合最小复制数这一要求或部分DataNode失效。
2)通知DataNode相互复制block。
3)DataNode开始相互复制。
【例3-3】HDFS设置block的目的?
减少硬盘寻道时间(Disk Seek Time)。HDFS设计的前提是支持大容量的流式数据操作,所以即使是一般的数据读写操作,涉及的数据量都是比较大的。假如数据块设置过少,那需要读取的数据块就比较多,由于数据块在硬盘上非连续存储,普通硬盘因为需要移动磁头,所以随机寻址较慢,读越多的数据块就增大了总的硬盘寻道时间。当硬盘寻道时间比IO响应时间还要长得多时,那么硬盘寻道时间就成了系统的一个瓶颈。合适的块大小有助于减少硬盘寻道时间,提高系统吞吐量。
减少NameNode内存消耗。HDFS只有一个NameNode节点,其内存相对于DataNode来说是极其有限的。然而,NameNode需要在其内存fsimage文件中记录在DataNode中的数据块信息,假如数据块大小设置过小,而需要维护的数据块信息过多,那NameNode的内存可能就不能满足需求了。