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之间会进行通信,复制数据块,保证数据的冗余性。