Apache Hadoop的重要组成部分是Hadoop分布式文件系统(HDFS, Hadoop Distributed Filesystem ))HDFS的设计初衷是为了支持高吞吐和超大文件的流式读写操作。传统的大型存储区域网络和网络附加存储给PB级的块设备或文件系统提供了一种集中式的低延时数据访问解决方案。因为SAN和NAS支持全功能POSIX语法,具有很好的存储伸缩性和低延时访问等优点,所以可以完美地满足关系数据库、内容交付系统及类似数据的块存储要求。 然而,试想一下这样的场景:成千上万台机器同时启动,并从集中式存储系统中同时读取成百PB的数据。传统存储技术不可能达到这样的规模!
为了解决这个问题,我们可以用一些独一立的机器搭建一个高性价比系统。这个系统中的侮台机器都拥有自己的I/O子系统、磁盘、RAM、网络接口、CPU,且支持部分pOSIX 功能(或按需求裁剪)。以下就是HDFS的一些特定目标。
可以存储几百万个大型文件,每个文件大小可以超过几十GB;文件系统的容量可达数十PB
利用横向扩展模式(scale-out),使用基于磁盘簇(JBOD)而不是磁盘阵列(RAID) 的一普通商用服务器实现大规模数据存取, 同时,在应用层完成数据复制以实现存储 的可用性和高吞吐率。
优化是针对大型文件的流式读写操作,而不是为了满足小文件的低延时访问。批量 处理的性能比互动响应的实时性更加重要。
能容忍机器某些部件故障和磁盘失效。
支持MapReduce处理所需要的功能与规模要求.
尽管HDFS可以不依赖MapReduce而独立应用于大型数据集的存储,但如果将它们结 合在一起,系统就会如虎添翼。例如,利用HDFS将输人数据分割成数据块分别存储 在不同机器的特点,MapReduce可以将计算任务分配给数据块所在的机器,从而实现数据读取的本地化,,提高系统的效率。
设计
HDFS在很多方面都遵循了传统文件系统的设计思想。譬如文件以不透明的数据块形式 存储,通过元数据管理文件名和数据块的映射关系、目录树结构、访问权限等信息。 这IfE和普通的Linux文件系统(如ext3 )是非常相似的。那么,HDFS又有什么与众不 同的地方呢?
传统文件系统是内核模块(至少在Linu、中是这样的)和用户空间工具,然后通过挂载 的形式提供给终端用户使用。但是HDFS却是一种用户空间文件系统。具体来说,文 件系统代码以os进程和扩展的形式运行在内核之外,而无须注册在Linux VFS层,所 以,HDFS是一种更加简单、更加灵活和更加安全的实现方式。HDFS不像ert3文件 统那样需要挂载,只要应用程序显式地编译它即可。
HDFS除了是用户空间文件系统外,它还是一种分布式文件系统。分布式文件系统突破 了单机或单个磁盘物理存储空问的限制,其主要思想是集群中的各个主机只存储文件 系统的一个数据子集,当需要存储更多数据块时,只需要添加更多挂载厂多个物理磁 盘的主机便可以实现。文件系统的元数据存储在中央服务器中,提供数据块的目录结 构,并维护着整个文件系统的全局状态。
HDFS与其他文件系统的另一个主要区别是基本数据块的大小。传统文件系统的数据块 大小一般是4 KB或8 KB,而Hadoop的数据块就大得多,默认为64MB,系统管理员 可以根据需要选择配置成128MB, 、256MB、甚至1GB增大数据块大小意味着数据可以被写人到磁盘中更大的连续块中,这也意味着数据的读写操作可以采用更大、更连 续的方式进行,这样就可以减少磁盘的查找操作,而查找是机械式硬盘运行中最慢的 一种操作,因此也就提升了处理大型数据流[I/O操作的效率。
守护进程
一个标准HDFS集群由3个守护进程组成。
NameNode 次NameNode DataNode
DataNode守护进程负责存储数据块,而NameNode(或简写成NN)守护进程则负责保 存文件系统的元数据,并维护文件系统全景图。尽管用户是连接在NameNode上进行文 件系统操作的,但正如我们稍后将要看到的那样,数据块是直接流人和流出DataNode 的,因此单个节点不会成为整个系统的瓶颈。DataNod。通过周期性心跳向NameNod。报 告各自的状态。因而,在任何时刻,NameNode都掌握着整个集群中每个DataNode的状 态:它们是否工作正常,哪些数据块是可用的等。图2-1给出了一个HDFS架构的实例。
在DataNode初始化的过程中,以及之后每隔1小时,都会向NameNode发送一个块报 告(block report)。所谓“块报告”,就是一个包含DataNode磁盘中所有数据块信息的 列表,这样NameNode就可以跟踪数据块的任何变化。块报告是非常重要的,因为在 NameNod。磁盘中保存了文件与数据块的映射关系,却并不保存数据块的位置信息。这 乍看起来似乎有悖常理,但这种设计的优点就是即便DataNode的IP地址或主机名发生了改变,也不会影响文件系统中断元数据的存储。这样做还有一个附带的好处,当一个DataNode的主板发生故障时,管理员只需拆下硬盘,将它们插入新的机箱,然后启 动新机器,这依然不会影响元数据的存储,在NameNode中看到的就是数据块迁移到 了一个新的DataNode上。当然这样做也有副作用,当全新初始化启动一个集群(在这 种情况下,重启集群也是一样的),NameNode必须收集齐所有DataNode的块报告后才 能知道所有数据块的存在。
为了快速查找和获取文件信息,NameNode文件系统的元数据全部保存在RAM中。当 然这样做就会限制NameNode能处理的元数据的大小。