本节书摘来异步社区《Hadoop技术详解》一书中的第2章,第2.2节,作者: 【美】Eric Sammer 译者: 刘敏 , 麦耀锋 , 李冀蕾 , 等

2.2 设计

HDFS在很多方面都遵循了传统文件系统的设计思想。譬如文件以不透明的数据块形式存储,通过元数据管理文件名和数据块的映射关系、目录树结构、访问权限等信息。这些和普通的Linux文件系统(如ext3)是非常相似的。那么,HDFS又有什么与众不同的地方呢?

传统文件系统是内核模块(至少在Linux中是这样的)和用户空间工具,然后通过挂载的形式提供给终端用户使用。但是HDFS却是一种用户空间文件系统。具体来说,文件系统代码以OS进程和扩展的形式运行在内核之外,而无须注册在Linux VFS层,所以,HDFS是一种更加简单、更加灵活和更加安全的实现方式。HDFS不像ext3文件系统那样需要挂载,只要应用程序显式地编译它即可。

HDFS除了是用户空间文件系统外,它还是一种分布式文件系统。分布式文件系统突破了单机或单个磁盘物理存储空间的限制,其主要思想是集群中的各个主机只存储文件系统的一个数据子集,当需要存储更多数据块时,只需要添加更多挂载了多个物理磁盘的主机便可以实现。文件系统的元数据存储在中央服务器中,提供数据块的目录结构,并维护着整个文件系统的全局状态。

HDFS与其他文件系统的另一个主要区别是基本数据块的大小。传统文件系统的数据块大小一般是4KB或8KB,而Hadoop的数据块就大得多,默认为64MB,系统管理员可以根据需要选择配置成128MB、256MB、甚至1GB。增大数据块大小意味着数据可以被写入到磁盘中更大的连续块中,这也意味着数据的读写操作可以采用更大、更连续的方式进行,这样就可以减少磁盘的查找操作,而查找是机械式硬盘运行中最慢的一种操作,因此也就提升了处理大型数据流I/O操作的效率。

传统文件系统依赖特殊的存储子系统实现对数据的保护。HDFS则不同,它可以将数据的多个副本分别存储到集群的多台不同主机上,从而实现对数据的保护。默认情况下,每一个数据块会被复制三份,因为HDFS的文件具有“只写一次”的特点,每个副本一旦写入完成,就不可能再被更改,所以根本无须考虑各数据副本的一致性问题。应用程序读取数据块的任何一个可用的副本都可以实现对文件的访问。因为数据块拥有多个副本,所以因主机故障而导致的数据丢失也可以很容易恢复,同时网络中的应用程序也更有可能从离其最近的主机中读取数据。HDFS会主动跟踪并管理可用数据块副本的数量。当副本的数目低于配置的复制因子时,文件系统会自动从剩下的副本中创建一个新的副本。在本书中,我们会频繁地使用副本(replica)来表示HDFS数据块的复制。

当然,应用程序并不希望太过关注数据块、元数据、磁盘、扇区以及其他底层系统的具体实现细节。相反,开发人员更希望通过诸如文件和流等高层抽象接口来实现I/O操作。HDFS提供给开发人员的文件系统是一套高级的、类似POSIX那样的程序员比较熟识的API。