Hadoop整合抽象了众多的文件系统类,HDFS只是其中一种的具体实现。它是基于流数据模式和处理超大文件的需求开发的,主要特点如下:
这里的超大文件通常是指MB到TB级别的数据文件,在实际应用中已经可达到PB级。
HDFS提供一次写入,多次读取的服务。一个数据集一旦提交,会复制分发到不同数据节点上,大多数数据分析任务都会涉及数据集中的大多数数据,请求读取整个数据集比请求读取某条数据更高效。
由于hadoop的设计对硬件要求并不高,节点可能是非常廉价的机器,节点故障率可能很高。这就要求HDFS考虑安全性,可靠性,高可用性。所以HDFS存在下述弱点:
传统操作系统中的块是操作文件的基本单位,大小通常是一个扇区512B。HDFS中文件也分块存储,但是它是抽象的块,是处理文件的逻辑单元,默认64MB(1.0),或128(MB)。抽象的文件块之所以这么大,就是为了处理大文件而设计,好处如下:
HDFS采用Master/Slave的架构,即由一个NameNode和若干个DataNode构成。NameNode是一个中心服务器,提供管理文件命名空间和客户端访问的服务,它执行文件命名空间的操作,比如文件的打开,关闭,重命名文件或目录,也负责文件块到DataNode的映射。集群中一般一个节点上运行一个DataNode进程,负责管理该节点的存储的文件块,负责对文件的读写请求,在NameNode的统一调度下,完成对数据块的创建,删除和复制。
副本的存放与复制是HDFS可靠性和性能的关键,优化的副本存放策略使得HDFS区别于其他分布式文件系统。HDFS通过机架感知(Rack-Ware)的策略来改进数据可靠性,可用性和网络带宽的利用率。大型HDFS实例运行于跨越多个机架的集群上,不通机架上的计算机通信需要经过交换机,通信成本较大。通过机架感知策略,NameNode可以确定每个DataNode所在的机架ID,HDFS将文件副本放在不同的机架上,有效防止了整个机架数据的丢失,也使读取数据时充分利用机架带宽。但是,进行写操作时就需要传输数据块到多个机架。
HDFS默认的副本数为3,存放策略是将一个副本放在本地机架,第二个副本放在同一个机架的另外一个节点上,第三份放在不同机架的节点上。该策略相当于数据分成三份存于两个机架上,这样的策略提高了写操作的效率,也减少了机架间的传输。机架间的错误比节点间的错误要少,所以保证了可靠性和可用性的同时改进了写操作的性能。
读取数据时,根据机架感知策略,HDFS会让读取程序尽量读取离客户端比较近的机架,以便减少整体带宽的消耗。如果和读取程序在同一个机架上有一个副本,则读取该副本。
NameNode在启动后会进入安全模式状态,该状态下NameNode不会进行数据块的复制。NameNode会从所有DataNode接收心跳信号和块状态报告。块状态报告包括某个DataNode的数据块列表。每个数据块都有最小的副本数。当NameNode检测到某个数据块副本数目大于等于最小时候,该数据块被认为是副本安全的;在一定百分比(可设置参数)的数据块被确认是安全后(加上30s等待时间),NameNode退出安全模式。随后,NameNode还会确认哪些数据块还没有达到副本安全,并将它们复制到其他节点上。
由于Master/Slave的架构特性,如果NameNode出现故障,则整个文件系统都会丢失。采用以下两种机制确保NameNode的安全: