Hadoop深入学习:HDFS分布式文件系统的体系结构

        Hadoop之所以成为能够让用户可以轻松架构和使用的分布式计算平台,用户可以在其上管理、开发和并行处理大数据的应用,其根本就是由于HDFS起的基础作用。
        HDFS主要由以下优点:
        1)、支持操大文件,一般来说,一个Hadoop文件系统可以轻松的存储TB、PB级别的数据。
        2)、检测和快速应对硬件故障,在大量通用的廉价硬件构建的集群上,特别是硬件故障很常见,一班的HDFS系统由成百上千台存储着数据文件的服务器组成,越多的服务器也就意味着高故障率,因此故障检测和制动恢复就是HDFS的一个设计目标。
        3)、流式数据访问方式,HDFS要处理的数据规模都比较大,应用程序一次需要访问大量数据,适用于批量处理而非用户交互式处理数据,HDFS以流式方式访问数据,注重的是数据的高吞吐量而非访问速度。
        4)、简化的一致性模型,大部分的HDFS的数据操纵文件都是一次写入,多次读取,一个文件一旦经过创建、写入和关闭后,一半就不需要修改了,这样简单的一致性模型,有利于提供高吞吐量的数据访问模型。
        对于上述设计目标,我们会发现,这些在一些场景中是优势,但是在默写情况下,会成为其局限性,主要有以下几点:
        1)、不适合低延迟的数据访问,HDFS是为处理大规模的数据而生的,主要是为达到高的数据吞吐量而设计的,这就会以高延迟作为代价,故不适合低延迟的数据访问。
        如果想在Hadoop上对数据做低延迟或实时的数据访问,在其上HBase是一个很好的解决方案。
        2)、不能搞笑的存储大量小文件,在HDFS中,有NameNode(Master)节点来管理文件系统的元数据,已相应客户端请求返回文件位置等,因此文件数量大小的限制就由NameNode(具体的来说是由其内存大小)来决定;另外,在一次数据访问中,更多的小文件也意味着更多的磁盘寻址操作,以及更多的文件的打开与关闭的开销,这会大大降低数据的吞吐量,这都有违HDFS的设计目标,也会给NameNode带来更大的工作压力。   
        3)、不支持多用户的数据写入和随机访问与修改文件,在一个HDFS写操作中只能有一个用户对一个文件写操作,并且自能通过追加的方式将数据写到文件末尾,在读一个文件的时候也只能从文件头部顺序读取文件数据。
        目前HDFS还不支持多个用户对同一个文件的并发写操作、随机访问和修改数据。
       
        下面我们来看看HDFS的体系结构:

        HDFS采用了主从(Master/Slaves)体系结构,互相配合,形成整个分布式文件系统。将服务器集群中的服务器节点分成两类节点:NameNode节点和DataNode节点,其中NameNode是Master节点而DataNode是Slaves节点。

        我们再看一下HDFS中的相关的概念:
        Block:
        我们知道,操作系统中都有文件块(Block)的概念,稳健以块的形式存储在磁盘中,文件块是系统读写操作的最小的单位。
        HDFS中的Block是一种抽象的概念,它比操作系统中的文件块儿要打的多,和Linux单机系统上的文件相同,HDFS中的文件也是被分成块而来存储的,其默认大小为64M,一般情况下可以将之调大。
        HDFS是针对大文件设计的分布式系统,使用HDFS Block有以下好处:
        1)、可以保存比存储节点的单一磁盘更大的文件,在HDFS上,将大数据文件分成块Blocks,可以保存在不同节点的磁盘上。
        2)、简化存储子系统,简单化是所有系统的追求,特别是在各章种类繁多的分布式系统,将管理“块(Block)”和“文件”区分开,简化了存储管理,也消除了分布式文件系统管理的复杂性。
        3)、提供更好的容错,有利于数据复制。

        NameNode:
        NameNode节点上HDFS主从结构中主节点,维护者整个HDFS文件系统的文件目录树,元数据信息和文件的数据块索引,即每个文件对应的数据块列表。这些信息以文件命名空间镜像FSImage和编辑日志Edit Log。
        FSImage中保存着某一时刻的HDFS文件目录树、元数据和数据块索引等信息,而后续的对这信息系的修改则保存在编辑日志中;然后在另外一个时间节点上有Secondary NameNode节点将之合并并替换掉老的FSImage。
        NameNode节点还提供对客户端的请求响应。
        该节点有单点故障问题,该节点如出故障,则整个集群都会出问题。
       
        Secondary NameNode:
        第二名字节点主要用于定期合并NameNode节点上的命名空间镜像文件和编辑日志,和名字节点一样,每个集群都有一个Secondary NameNode的独立节点。
        Secondary NameNode和NameNode的区别在于他不接受或记录HDFS的任何实时变化,只是根据集群配置的时间间隔不停的获取HDFS的某一个时间节点的FSImage和编辑日志,合并得到一个新的命名空间镜像FSImage,然后该镜像会上传到NameNode,替换原有的镜像文件,并清空编辑日志。
        NameNode节点是HDFS集群中的单一故障点,通过Secondary NameNode的检查点,可以减少停机时间并减低NameNode节点中元数据丢失的风险。但是Secondary NameNode不支持NameNode节点的故障自动回复,须手人工干预。

        DataNode:
        DataNode是HDFS集群中的数据节点,所用数据块儿都存储在DataNode节点上,客户端从DataNode节点存储或读取数据。
        在HDFS中在DataNode上是以Linux系统上普通文件进行保存。在客户端操作文件块Block时,先由NameNode节点告知客户端诗句块所在的节点地文职,然后客户端直接与DataNode节点通信,处理与数据块对应的Linux上的本地文件。DataNode节点还会和其他DataNode进行通信,复制数据块,保证数据的冗余。
        DataNode作为从节点,会不断地通过“心跳”向NameNode节点报告其上的数据信息。

猜你喜欢

转载自flyingdutchman.iteye.com/blog/1874518
今日推荐