HDFS核心组件:

  一、HDFS的元数据解析:

              1、(1)、元数据(metadata):指数据的数据,用于描述描述和组织具体的文件内                                                                   容。


                               HDFS的元数据:维护HDFS文件系统中的文件和目录所需要的信息。

                   (2)、分类:  

                               形式:  分为 内存元数据和元数据文件两种。

                                           NameNode :在内存中维护整个文件系统的元数据镜像。

                                                                用于HDFS的管理。

                                              元数据文件则用户持久化存储。

                               类型: 三类重要信息:

                                       (1)、文件和目录自身属性信息。例:文件名,目录,大小,创建,修                                                改时间。

                                       (2)、记录文件内容存储相关信息。例:文件分块,副本个数,

                                              每个副本所在的datanode信息等。          

                                       (3)、用来记录HDFS中所有Data Node的信息。用于Data Node管                                                   理。

                              来源:   

                                       源于Namenode磁盘上的元数据文件(包括元数据镜像fsimage和元数                                        据日志操作日志edits两个文件)以及各个Data  Node的上报信息。

              2、 内存元数据结构:

                          (1)、inode  :

                                  inode信息位于内存,有效提高元数据性能。 类FSNamesystem的成员                                       变量dir实现了对整个HDFS中inode的组织和操作,是一FSDirectory                                        类。

                                  将inode信息保存到磁盘,由类FSImage完成。构架在内存元数据与磁                                     盘元数据文件之间的桥梁,HDFS初始化时,负责将磁盘元数据文件中                                     的记录转化为内存元数据中的inode;需要持久化存储时,负责将元数据                                   操作转换为日志记录并保存。


                                HDFS采用元数据镜像文件FSImage + 日志文件(edits)的备份机制,镜                                     像文件是某一时刻内存元数据的真实组织情况。日志文件记录了该时刻                                     以后所有的元数据操作。


                                HDFS启动时读取元数据镜像文件和日志文件到内存,合并成为新的内存                                   元数据。将该元数据保存到磁盘,形成新的磁盘镜像文件和日志文件。在                                 运行过程中,只将元数据操作记录到日志文件中。


                               优点: 保证了元数据内容不丢失,最大限度降低了元数据开销,

                               缺点是:HDFS启动加载后,进行合并会消耗一定的时间。


                               实现时,所有与元数据镜像文件相关操作由类FSDirectory的成员变量                                      fsimage完成,是一个FSImage类。与日志文件相关操作由类FSImage的                                成员变量editlog完成。是一个FSEditlog类。

 

   Block数据块:

                (1)、基本存储单位,一般大小为64M/128M/256M

                (2)、大文件会被拆分成一个个的块,存储于不同的机器。

                           文件小于Block大小,实际占用空间是文件的大小。

                (3)、基本读写单位,每次都是读写一个块。

                (4)、为了容错,文件所有数据块有副本,默认复制3份,副本系数可配置。


       block的副本:

                 对于每一个block,HDFS将其内容复制多份,以文件形式 保存到各个Data Node                        上。一个block有3个副本。


            类INodeFile中设置了一个Block的数组来保存该文件所有的Block信息。 并提供了相应的Block操作方法。每一个Block的信息由类blockinfo来表示,类Blockinfo中的成员变量保存了该block副本所在的Data  Node的信息。 每一个Data  Node信息通过类DatanodeDescriptor进行描述。具体包括容量,空间使用率,剩余容量,更新时间,主机名等


           当一个客户端访问某一文件特定偏移量的内容时,HDFS首先根据路径信息找到该文件对应的Inode,根据偏移计算出Block位置,在“protected    Blockinfo  blocks[ ] = null;”中找到相应的Blockinfo,然后在“private  object[ ]  triplets;”找到副本所在Data  Node的信息,然后选择其中的一个Data  Node进行连接,获取相应的内容。

                   Block信息位于内存,来源于底下各个Data Node的上报信息,这些信息由Data  Node维护。


               HDFS元数据的三个关键类(管理对象):

                    Inode  :文件系统基本元素;文件和目录。

                    Blockinfo :代表文件内容对象。

                    DatanodeDescriptor ;代表具体存储对象。


                    类BlockManager 包含成员变量:"final blocksmap blocksmap;"  类Blocksmap                    实现了HDFS中所有Block的管理。构建了一个hash                              表“privateMap<blockinfo,blockinfo>map;” 来存储所有的block,实现block的快速检索和 其他操作。

                  Hash表“NavigableMap<string,datanodeDescriptor>datanodeMap” 实现了HDFS中所有Data  Node的管理, 存储了HDFS中所有的Data  Node,通过键值StorageID可以快速定位到相应的Data  node。

 

                  总结:  在HDFS中,由类FSNamesystem来代表总的元数据,由它对外提供统一的元数据操作接口,这些接口的实现由它的成员变量及相关方法组合实现。 最重要的三个成员变量;public  FSDirectory dir,  BlockManager  blockManager,    NavigableMap<String,datanodeDescriptor>datanodemap 。

 

   NameNode :

               (1)、Namenode是中心服务器,负责管理文件系统的名字空间以及客户端对文件的                          访问。

               (2) 、存储文件的metadata: 包括整个文件系统的目录树,文件名与blockid的映射                         关系,blockid所在的DN信息。

               (3)、运行时所有数据都保存到内存,整个HDFS可存储的文件数受限于NameNode的                        内存大小 。

               (4)、一个block在namenode中对应一条记录(1条记录占用150字节).

               (5)、元数据会定时保存到本地磁盘(fsimage),不保存block的位置信息。由                                    datanode 注册时上报和运行时维护。

               (6) 、namenode失效则整个HDFS都失效,要保证namenode的可用性。    

 

   

        DataNode

               (1)、保存具体的block数据。

               (2)、负责数据的读写操作和复制操作。

               (3)、DataNode启动时会向NameNode报告当前存储的数据块信息,后续也会定时

                      报告修改信息。

               (4)、DataNode之间会进行通信,复制数据块,保证数据的冗余性。