Hadoop HDFS 详解

2,714 阅读8分钟


本文内容出自以下链接

www.cnblogs.com/52mm/p/p13.…

正文

HDFS特点

  • HDFS文件系统可存储超大文件
       1)HDFS是一种文件系统,自身也有块(block)的概念,其文件块要比普通单一磁盘上文件系统大的多,hadoop1.0上默认是64MB,2.0默认是128MB。与其他文件系统不同的是,HDFS中小于一个块大小的文件不会占据整个块的空间。

       2)HDFS上的块之所以设计的如此之大,其目的是为了最小化寻址开销。如果块设置得足够大,从磁盘传输数据的时间会明显大于定位这个块开始位置所需的时间。

      3)HDFS文件的所有块并不需要存储在一个磁盘上,因此可以利用集群上任意一个磁盘进行存储,由于具备这种分布式存储的逻辑,所以可以存储超大的文件。

  • HDFS同一时刻只允许一个客户端对文件进行追加写操作(不支持多个写入者的操作,也不支持在文件的任意位置修改),这样避免了复杂的并发管理功能,但也限制了系统性能。
  • 运行在普通廉价的机器上

       Hadoop的设计对硬件要求低,无需昂贵的高可用性机器上,因为在HDFS设计中充分考虑到了数据的可靠性、安全性和高可用性。

  • HDFS适合存储大文件并为之提供高吞吐量的顺序读/写操作,不太适合大量随机读的应用场景,也不适合存大量小文件的应用场景。HDFS是为高吞吐量应用优化的,会以提高时间延迟为代价,因此不适合处理低时延的数据访问的应用。


HDSF体系架构

  • HDFS是一个主/从(Master/Slave)体系架构,由于分布式存储的性质,集群拥有两类节点NameNodeDataNode

  • NameNode(名称节点):系统中通常只有一个,中心服务器的角色,管理存储和检索多个DataNode的实际数据所需的所有元数据,响应客户请求。
  • DataNode(数据节点):系统中通常有多个,是文件系统中真正存储数据的地方,在

NameNode统一调度下进行数据块的创建、删除和复制。



NAMENODE

  • NameNode负责整个分布式文件系统的元数据,包括文件目录树,文件到数据块Block的映射关系等。 这些元数据信息主要为:    

       “文件名 -> 数据块‘’映射    

       “数据块 -> DataNode列表”映射

  其中,"文件名 -> 数据块"保存在磁盘上进行持久化存储,需要注意的是NameNode上不保存‘’数据块 -> DataNode列表”映射,该列表是通过DataNode上报给NameNode建立起来的。NameNode执行文件系统的名称空间(namespace)操作,例如打开、关闭、重命名文件和目录,同时决定文件数据块到具体DataNode节点的映射。

  • 这些元数据保存在内存里,同时这些数据还以两个文件形式永久保存在本地磁盘上:命名空间镜像文件(fsimage)和编辑日志文件(editlog)。
  • fsimage是内存命名空间元数据在外存的镜像文件.
  • editlog文件则记录着用户对文件的各种操作记录,当客户端对hdfs中的文件进行新增或者修改操作,操作记录首先被记入editlog文件中,当客户端操作成功后,相应的元数据会更新到内存meta.data中,防止发生意外导致丢失内存中的数据。
  •  fsimage和editlog两个文件结合可以构造出完整的内存数据。
  •  NameNdoe还负责对DataNode的状态监控。DataNode定期向NameNode发送心跳以及所存储的块的列表信息。NameNode可以知道每个DataNode上保存着哪些数据(Block信),DataNode是否存活,并可以控制DataNode启动或是停止。若NameNode发现某个DataNode发生故障,会将其存储的数据在其他DataNode机器上增加相应的备份以维护数据副本(默认为3,可在配置文件中配置)保持不变。
  • DataNode负责数据块的实际存储和读/写工作。在hadoop1.0时,DataNode的数据块默认大小为64M,2.0版本后,块的默认大小为128M。当客户端上传一个大文件时,HDFS会自动将其切割成固定大小的Block,每个块以多份的形式存储在集群上,默认为3份。
  • 如果NaneNode服务器失效,集群将失去所有的数据。因为我们将无从知道哪些
    DataNode存储着哪些数据。因此NameNode的高可用,容错机制很重要。


DATANODE

     HDFS的管理节点是NameNode,用于存储并管理元数据。那么具体的文件数据存储在哪里呢?答案就是DataNode.

     DataNode就是负责存储和读/写数据的组件,一个数据块Block会在多个DataNode中进行冗余备份;而一个DataNode对于一个块最多只包含一个备份。所以可以简单地认为DataNode上存储了数据块ID和数据块内容,以及它们的映射关系。一个HDFS集群可能包含上千个DataNode节点,这些DataNode定时和NameNode进行通信,接受NameNode的指令,为了减轻NameNode的负担,NameNode上并不永久保存哪个DataNode上有哪些数据块的信息,而是通过DataNode启动时的上报来更新NameNode上的映射表。【这个和上述讲解namenode的职责是一样的】 DataNode和NameNode建立连接后,就会不断地和NameNode保持联系,反馈信息中也包含了NameNode对DataNode的一些命 令,如删除数据库或者把数据块复制到另一个DataNode。应该注意的是:NameNode不会发起到DataNode的请求,在这个通信过程中,它们 严格遵从客户端/服务器架构。

    当然DataNode也作为服务器接受来自客户端的访问,处理数据块读/写请求。DataNode之间还会相互通信,执行数据块复制任务,同时,在客户端执行写操作的时候,DataNode之间需要相互配合,以保证写操作的一致性。DataNode是文件系统Worker中的节点,用来执行具体的任务:存储数据块,被客户端和NameNode调用。同时,它会通过心跳(Heartbeat)定时向NameNode发送所存储的数据块信息。

   在hadoop1.0时,DataNode的数据块默认大小为64M,2.0版本后,块的默认大小为128M。当客户端上传一个大文件时,HDFS会自动将其切割成固定大小的Block,每个块以多份的形式存储在集群上,默认为3份。


NAMENODE与SECONARY NAMENODE 容错

      因为namenode上保存着整个hdfs集群上的所有元数据信息,如果namenode宕机,集群将失去所有数据,因此对namenode实现容错十分重要,Hadoop为此提供了两种机制:
  • 第一种是在配置文件里配置namenode的工作目录为多个,这样可以将元数据信息存到多块磁盘上,或是多台机器上,甚至可以将元数据存在远程挂载的网络文件系统中(NFS),可以通过配置使namenode在多个文件系统上实时保存元数据。这样一来,namenode的工作目录所在的磁盘损坏后,还有其他磁盘上的数据可用。
  • 第二种是运行一个辅助namenode,被称为secondary namenode(第二名称节点)。secondary namenode的职责并不是作为namenode的热备份机,其主要作用是定期从namenode拉取fsimage和editlog,并将两者合并成新的fsimage,将新的fsimage返回给namenade。这种方式,一方面可以避免namenode上的编辑日志过大,另一方面将合并操作放在secondary namenode上可以节省namenode的cpu时间和内存,减轻namenode的工作压力,让namenode更专注于自己的本职工作。secondary namenode中保存的fsimage数据总是会滞后于namenode内存中的元数据,所以在namenode宕机后,难免会有部分的数据丢失。(可以把NFS上的namenode元数据复制到secondary namenode上,使其成为新的namenode,并不损失任何数据)



SECONARY NAMENODE

       secondary namenode将namenode上积累的所有editlog下载到本地,并加载到内存进行merge,这个过程称为checkpoint,目的是为了刷新fsimage。步骤详解:

            1)secondary namenode通知namenode要进行checkpoint了。(定时,或是namenode上的editlog数量达到一定规模)。

            2)namenode做准备。

            3)secondary namenode将namenode的editlogs下载到本地磁盘上。

            4)secondary namenode将editlogs和fsimage加载到内存中,进行合并产生新的fsimage。

            5)secondary namenode将新的fsimage传回给namenode(覆盖namenode上旧的fsimage文件),并将其保存到本地磁盘上覆盖掉旧的fsimage。

     注意点:

           1)  hdfs上数据的更新修改等操作都会先写入编辑日志文件,再更新到内存里。

           2)  secondary namenode节点只有在启动后,第一次进行checkpoint时才会将namenode的editlog和fsimage都下载到自己的本地磁盘,再进行合并。后期的checkpoint都只会下载editlog文件,而不会下载fsimage,因为自己磁盘上保存的fsimage和namenodev上的是一样的。


正文结束