分布式文件系统HDFS简要介绍

HDFS 的设计主要基于如下六点考虑:node

(1)容错缓存

独立计算机的硬件错误不能当异常状况处理,而属于正常状态。HDFS 文件系统中会有许多个普通计算机节点构成, 在任什么时候间任何一个节点都有可能出现故障, 所以HDFS 应该设计成可以自动恢复和快速检测错误, 这应该是维持HDFS 可靠运行的核心目标。服务器

(2)流式访问数据集网络

HDFS上运行的应用程序须要以流式访问所存储的数据集。这些应用程序都采用并行的批处理方式进行数据计算,不一样于普通系统上用于数据处理的应用程序。提升数据访问吞吐量是研究HDFS的重点,响应时间和数据访问的延迟则不做过多考虑。架构

(3)大数据存储分布式

HDFS 最基本的目标就是支持大数据存储。一个存储在HDFS 系统上面的普通文件大小都在千兆至T 字节, 一个HDFS 应用最基本的要求是能支撑海量文件。布局

(4) 数据一致性性能

HDFS 应用处理文件的方式是一次写入屡次读取。单个文件写入到HDFS 中后就不须要改变。这种处理文件的方式让数据一致性问题获得简化, 可以大幅度的提升HDFS 文件访问的吞吐量。大数据

(5)速度spa

移动计算的方式代价比移动数据的方式开销要低。一个须要计算的请求,若是计算离操做数据越近那么计算出来的结果就越高效, 特别是在海量级别的数据计算时,效率更加明显。

(6)可移植性

在异构的软件和硬件平台间提供可移植性。HDFS 由Java 语言开发,Java 语言的跨平台特性完美的解决了这一要求。



HDFS采用master/slave架构。一个HDFS集群是由一个Namenode和必定数目的Datanode组成,这些Datanode定时和Namenode通讯,像Namenode反馈状态以及接受Namenode的指令[p。为了减轻Namenode的负担,Namenode上并不须要永久保存全部Datanode上包含有哪些数据块的信息,而是经过Datanode在启动时的上报数据块信息,来更新Namenode上的映射表。HDFS暴露了文件系统的名字空间,用户能够经过以文件的形式在上面存储数据。从内部看,一个文件其实被分红一个或多个数据块(至少须要被划分红一个块),这些块一般存储在多个Datanode上,经过冗余性来保证可靠性以及加快后期的读取速度。Datanode负责处理分布式文件系统客户端的实际的读写数据请求。在Namenode的统一调度下进行数据块的建立、删除和复制。

HDF S是一个能在大集群中存储超大文件的系统,支持跨机器存储,并且运行可靠。每一个文件都会被分红一系列大小为64MB(初始定义为64,实际在工程中能够本身设置,报告的后面会有相关操做)的数据块,最后一个数据块除外。为了容错,在文件的数据块存储到DataNode中时相应的都会存储副本。通常状况下都会有三个副本而且放在不一样的地方,第一个副本会被放在本地节点,同时本地机架上的另一个节点会放置第二个副本,第三个副本则经复制后分别放到不一样机架上的节点。这种方式的好处就是能够减小机架内的写流量,提升了写的性能,同时,能够自由配置每一个文件的数据块大小和副本系数,应用程序能够指定某个文件的副本数目。副本系数能够在文件建立以前制定或者建立以后修改。


Namenode是整个分布式文件系统的主服务器,是整个系统的核心,从命名咱们能够清晰的看出是整个系统的名称服务器,Namenode做为HDFS中文件目录和文件分配的管理者,它保存的最重要信息,就是下面两个映射:文件名到数据块;数据块到Datanode列表。其中文件名到数据块的信息保存在磁盘上(持久化);但Namenode上不保存数据块到Datanode列表。在保存文件名到数据块的过程当中,为了保证每次修改不须要重新保存整个结构,HDFS使用操做日志来保存更新。如今能够获得Namenode须要存储在Disk上的信息了,包括:in_use.lock,fsimage和edits.in_use.lock的功能和Datanode的一致。fsimage保存的是文件系统的目录树,edits则是文件树上的操做日志,fstime是上一次新打开一个操做日志的时间(long型)。除此以外,Namenode执行文件系统的名字空间操做,好比打开、关闭、重命名文件或目录。它也负责肯定数据块到具体Datanode节点的映射。NAMENODE主要功能

(1)管理元数据和文件块

管理元数据就是对它包含的名字空问、文件到文件块的映射、文件块到数据节点的映射进行管理。其中,要求文件名到数据块的映射不只要保留在内存中,还要持久化到磁盘上。文件块的管理不只包括文件块的新建、复制,同时还包括无效文件块的移除以及孤立文件块的回收等。

(2)简化元数据更新操做

为了不每次都要从新保存整个结构,NameNode会记录每次对文件系统的元数据进行修改的操做,并用事务日志(Editlog)进行表示。与此相似,修改文件的副本系数的操做也会被记录到Editlog中,而Editlog会被NameNode存储到本地的操做系统的文件系统中。NameNode管理整个存储在FsImage文件中的文件系统的命名空间,包括文件的属性、数据块到文件的映射,FsImage文件与Editlog同样都被存储在NameNode所在的本地文件系统中。当NameNode启动时,Editlog和FsImage就从硬盘中被其读取,把Editlog记录的全部事务做用于FsImage,并将新产生的Fslmage替代旧的Editlog刷新到硬盘中。

(3)监听和处理请求

与客户端和DataNode不一样,NameNode只是监听客户端事件及DataNode事件。而不会主动发起请求,客户端事件一般包括目录和文件的建立、读写、重命名和删除,以及文件列表信息获取等。DataNode事件主要包括数据块信息的汇报、心跳响应、出错信息等。当NameNode监听到这些请求时便对他们响应,并将相应的处理结果返回到请求端。

(4)心跳检测

链接创建之后,DataNode和NameNode之间会不断保持心跳,这样DataNode在向NameNode汇报本身的负载状况的同时还会接收来自NameNode的指令信息。若是有哪一个DataNode没有在必定时间内对NameNode按期的ping做出回应,就会被认为是出现了故障,此时,NameNode就会从新调整整个文件系统。


Datanode负责存储数据,一个数据块在多个Datanode中有备份,而一个Datanode对于一个数据块最多只包含一个备份。因此能够简单地认为Datanode上存了数据块ID和数据块内容,以及他们的映射关系。一个HDFS集群可能包含上千Datanode节点,这些Datanode定时和Namenode通讯,接受Namenode的指令。为了减轻Namenode的负担,Namenode上并不永久保存那个 Datanode上有那些数据块的信息,而是经过Datanode启动时的上报,来更新Namenode上的映射表。

Datanode和Namenode创建链接之后,就会不断地和Namenode保持心跳。心跳返回时包含了Namenode对Datanode的一些命令,如删除某个数据块或者是把数据块从一个D atanode复制到另外一个D atanode。应该注意的是:Namenode不会发起到Datanode的请求,在这个通讯过程当中,它们是严格的客户端/服务器架构。Datanode固然也做为服务器接受来自客户端的访问,处理数据块读/写请求。Datanode之间还会相互通讯,执行数据块复制任务,同时,在客户端作写操做的时候,Datanode须要相互配合,保证写操做的一致性。

DATANODE主要功能:

(1) 数据块的读写。

全部文件的数据块都存储在DataNode中,但客户端并不知道某个数据块具体的位置信息,因此不能直接经过DataNode进行数据块的相关操做,全部这些位置信息都存储在NameNode。所以,当系统客户端须要执行数据块的建立、复制和删除等操做时,须要首先访问NameNode以获取数据块的位置信息,而后再访问指定的DataNode来执行相关操做,具体的文件操做最终由客户端进程而非DataNode来完成。

(2) 向NameNode报告状态。

因为数据块到DataNode的映射并无持久化到NameNode本地磁盘,NameNode只能经过与DataNode之间的心跳信号来掌握文件块状态,进而掌握整个工做集群中全部DataNode节点状态的总体布局,假如DataNode出现异常状态,及时做出调整。当某个DataNode出现故障而致使失效时,为了保证数据块的副本数量达到规定范围。NameNode就会调度相关DataNode执行失效结点上数据块的复制操做。

(3) 执行数据的流水线复制。

当建立文件或者是某些DataNode出现故障而致使数据块副本数量少于规定数目时,系统要执行数据块复制操做。客户端在从NameNode获取到须要进行复制的数据块列表以后,首先会把缓存于客户端的数据块复制到第一个DataNode上,而后采起流水线复制的方式,在同一时间将第一个DataNode上的数据复制到第二个DataNode,以此类推,直到全部数据块的复制操做所有完成。流水线复制有效地提高了系统的运行速度,特别是针对某些热点数据须要复制大量Block的情形,每每能取得很是好的效果。

HDFS元数据缓存策略:

HDFS的全部元数据都是由Namenode来进行管理和维护的。在Namenode中一共保存了如下3种类型的元数据:文件和块的命名空间、文件名到块的映射、以及每一个块副本的位置。其中文件名到数据块的映射持久化在磁盘土,而不只仅保留在内存中。全部对目录树的更新以及文件名和数据块之间关系的修改,都必须可以持久化。为了保证每次修改不须要从新保存整个结构,HDFS使用操做日志来保存更新。对于任何对文件元数据产生的修改,Namenode都会使用一个称为Editlog的事务日志记录下来。例如,在HDFS中删除一个文件,Namenode就会在Editlog中插入一条记录来表示;一样,修改文件的复制(replication因子也将在Editlog插入一条记录。Namenode在本地操做系统的文件系统中存储这个Editlog。整个文件系统的namespace,包括数据块到文件的映射、文件的属性,都存储在称为FsImage的文件中,这个文件也是放在Namenode所在操做系统的文件系统上。

Namenode在内存中保存着整个文件系统的名字空间和文件名到数据块的映射。这个关键的元数据设计得很紧凑,在存储大文件时,一个带有4G内存的Namenode足够支撑海量的文件和目录。当Namenode启动时,它从硬盘中读取Editlog和FsImage,将全部Editlog中的事务做用在内存中的FsImage,并将这个新的FsImage从内存中刷新到硬盘上,而后再丢弃这个旧的Editlog。

数据完整性策略: 

因为网络的复杂性,可能致使DataNode 节点读取的数据为损坏状态,缘由有多种可能性,常见的有网络通讯错误、程序问题、DataNode 节点自身存储等等状况。这时就须要一套数据校验机制保证数据的完整性。客户端写入一个新的文件时,将会计算每一个文件块的校验和, 而后将校验和保存为一个单独的隐藏文件, 并将校验和文件同时存储在目录空间下。若是客户端要读取文件,将会同时读取目录空间下的校验文件,并对DataNode 节点上的文件块的校验进行匹配, 若是匹配出现错误,那么说明该文件块的数据有问题,客户端将会选择其余的文件块副本所在的DataNode 节点进行文件块读取操做。

副本放置策略:

在HDFS中,每个数据块默认条件下都会保存3个备份(也能够自行修改备份的数量),为了使后期读取效率更高而且同时保证数据的可靠性,HDFS设计了相应的副本放置策略,通常状况下,第一个block副本放在和client所在的node甩(若是client不在集群范围内,则这第一个node是随机选取的,固然系统会尝试不选择哪些太满或者太忙的node)。第二个副本放置在与第一个节点相同的机架中的node中(随机选择)。第三个副本与第一二个副本不一样的机架中,随机放在不一样的node中。若是还有更多的副本就随机放在集群的任意位置。HDFS的副本放置策略在充分考虑了系统的可靠性(block在不一样的机架)和带宽(一个管道只须要穿越一个网络节点),并在它们之间作了一个很好的平衡。

相关文章
相关标签/搜索