HDFS的重要概念

这里按照<权威指南>的内容来描述HDFS的一些重要概念.

1.数据块

咱们的电脑硬盘也有分块一说,之前默认是512字节,现在是4KB.但是有一个问题,假如我使用的是4KB的分块,假如一个数据只有100字节大小,在我们的电脑上,这个数据也占用4KB空间,但是实际大小依旧是100字节.

在HDFS上,数据块的大小默认为128MB.你可能会说,这么大的块,要是只存储100字节的数据,岂不是要浪费剩下的所有空间?HDFS避免了这一点,不论多小的数据,也不会单独占用一个数据块.一个块可以存有多个文件,这与我们电脑的情况非常不一样.

但是为什么要设计这么大的数据块?目的是为了最小化寻址开销.现在的硬盘速度已经可以达到200MB/S(机械硬盘),但是随机存取依旧是一大硬伤,每个硬盘性能测试都会有4KB随机存取,机械硬盘在这里被固态硬盘甩开几百倍有余:寻道时间占了大多数,读取时间非常短.在HDFS上,这么大的数据块就算寻找的非常慢,读取时间也是远远长于寻道时间,解释一下就是,如果块足够大,从磁盘传输数据的时间会明显大于定位这个块所需的时间.

设计成数据块有一个好处,是跟以文件为单位为对比得出的:就是可以简化存储子系统的设计.一来可以简化存储管理,二来可以消除对元数据的顾虑:元数据与数据块分开存储而不是在一起.

还有就是非常适合用于数据备份,因而提升了容错性.默认情况下HDFS一个数据块会在不同的机器上至少存在3份,如果发现一个块不可用,就可以从其他可用的块读取,而损坏的块稍后会由系统自动处理.

2.namenode

前面提到,HDFS是一种主从模式运行的系统,那么namenode就是其中的这个"".

它管理着文件系统命名空间,维护着文件系统树以及整棵树内所有的文件和目录.这些信息以2个文件的形式存储在本地目录:命名空间镜像文件(fsimage)和编辑日志文件(edits).它也记录每个文件中各个块所在的数据节点信息,但是并不永久保存块信息:每次系统启动时都会根据datanode发来的信息重建,块信息存储在内存中.

所以可以看出,namenode的正常运行对HDFS至关重要.如果namenode发生故障,那么整个文件系统都会变得不可用:文件会全部丢失,因为不知道如何根据datanode的块重建文件.此时就需要一定的容错机制,Hadoop为此提供两种方法:

1.将信息同步存储在其他位置,具体做法是,namenode自己存储一份,同时写入其他位置,比如网络文件系统(NFS)

2.运行一个辅助namenode,但是这个namenode不能作为主namenode,它的作用是定期帮助主namenode合并edits与fsimage,以防止编辑日志过大.一般来说辅助namenode在一个单独的机器上运行,因为两者的内存需求是相同的.设计成这样的好处在于,一旦主namenode发生故障,辅助namenode立刻就可以接替它的工作,但是由于保存数据是定时进行的,所以难免会有损失的数据,此时就可以把保存在其他地方(NFS)的数据复制到辅助namenode,然后辅助namenode作为新的主namenode运行.

3.datanode

datanode就是主从结构的"",是工作节点,它们根据需求存储并检索数据块,定期向namenode发送所存储的块列表.

4.块缓存

市面上有一种混合硬盘,在机械硬盘的基础上加入了一颗flash,其作用是保存用户经常使用的数据,由于flash的速度大大高于机械硬盘的速度,所以用户访问这些数据时速度会明显加快.对于HDFS也是如此,被经常访问的数据会被缓存在datanode的内存中,以堆外缓存的形式存在.一般来说一份数据只会存在一个datanode的内存中,当然也是可以指定的.

5.联邦HDFS

由于namenode在内存中保存文件系统的每个文件和数据块的引用关系,所以当文件过多时,namenode的内存会出现瓶颈.联邦HDFS就是为了解决这种情况的,可以指定多个namenode,每个namenode管理文件系统命名空间的一部分,比如两个namenode分别管理文件夹/A与/B.

在这种情况下,每个namenode维护一个命名空间卷,有命名空间的元数据与一个数据块池组成,数据池下包含命名空间下文件的所有数据块.命名空间之间是两两独立的,互相之间不通信,其中一个namenode失效也不会影响其他的namenode.数据块池不再进行切分,因此datanode需要注册到所有的namenode,并存储着来自多个数据块池中的数据块.

猜你喜欢

转载自blog.csdn.net/bujiujie8/article/details/86552821