首家大数据培训挂牌机构 股票代码:837906 | EN CN
异常解决方案—NameNode 宕机读写测试
异常解决方案—NameNode 宕机切换实验
异常解决方案—Data Node 配置
异常解决方案—Backup Node配置
异常解决方案—NameNode配置
异常解决方案—6.5.1异常情况分析
安装及配置
5NameNode安装及配置以及6BackupNode安装及配置
6.4.4虚拟机集群架设
6.4.3安装JDK
3.配置操作系统
2.创建虚拟机与安装操作系统
6.4构建实验环境
实验方案说明
故障切换机制
日志池(journal spool)机制
元数据操作情景分——BackupNode更新磁盘上的日志文件
元数据操作情景分——NameNode通过日志输出流......
元数据操作情景分——NameNode将日志写入日志文件
元数据操作情景分——NameNode更新内存镜像
元数据操作情景分——客户端执行命令流程
元数据操作情景分
Hadoop的Backup Node方案——运行机制分析(5)
Hadoop的Backup Node方案——运行机制分析(4)
Hadoop的Backup Node方案——运行机制分析(3)
Hadoop的Backup Node方案——运行机制分析(2)
Hadoop的Backup Node方案——运行机制分析(1)
Hadoop的Backup Node方案——系统架构
Hadoop的Backup Node方案—Backup Node 概述
元数据可靠性机制以及使用说明
Checkpoint 过程情景分析
元数据更新及日志写入情景分析
NameNode启动加载元数据情景分析
Hadoop的元数据备份机制的进行分析
元数据应用场景分析
Format情景分析
磁盘元数据文件
HDFS之代码分析——元数据结构
HDFS之内存元数据结构
什么是HDFS的元数据
Hadoop中DRDB方案和AvatarNode方案
Hadoop中常用各方案的对比
Hadoop的BackupNode方案
Hadoop的CheckpointNode方案
Hadoop的SecondaryNameNode方案
Hadoop的元数据备份方案
影响HDFS可用性的几个因素
什么是高可用性? 详细解析
HDFS系统架构简介
如何安装和配置Hadoop集群
如何在Windows下安装Hadoop
在MacOSX上安装与配置Hadoop
Linux下安装Hadoop的步骤
Hadoop的集群安全策略介绍
Hive的数据管理介绍
HBase的数据管理介绍
HDFS的数据管理介绍
Hadoop计算模型之 MapReduce 简介
Hadoop于分布式开发
Hadoop体系结构介绍
Hadoop的项目结构详解
一文读懂Hadoop

HDFS之内存元数据结构

于2018-01-15由小牛君创建

分享到:


HDFS自身实现的角度来看,文件和目录是文件系统的基本元素,HDFS将这些元素抽象成INode,每一个文件或目录都对应一个唯一的INodeINode存储了名字信息(分别对应文件或目录的名字)同时还存储了创建时间、修改时间、父目录等信息,这些都是目录和文件的一些公共属性。

需要注意的是:有了INode信息,HDFS就可以构建整个文件系统的层次结构,并保存每个文件或目录的属性信息,用户就可以对文件和目录进行创建、删除等操作,唯一不能完成的操作是读取和写入文件的内容。

1 INode

在具体实现上,类FSNamesystem的成员变量dir实现了对整个HDFSINode的组织和操作,它是一个FSDirectory类,由于所有INode的信息完全位于内存,因此可有效提高元数据的服务性能。

正因为INode信息完全位于内存,一旦掉电将不再存在,因此需要将INode信息保存到磁盘,这个功能是由类FSImage完成的,类FSImage是构架在内存元数据与磁盘元数据文件之间的桥梁,在HDFS初始化时,它负责将磁盘元数据文件中的记录转化为内存元数据中的INode;在需要持久化存储时,它负责将元数据操作转换为日志记录并保存。

由于所有的元数据都位于内存,其大小随文件系统的规模增大而增大,如果每次都将整个内存元数据导出到磁盘,将会带来很大的系统开销,HDFS在实现时,没有采用定期导出元数据的方法,而是采用元数据镜像文件(FSImage+日志文件(edits)的备份机制,其中镜像文件是某一时刻内存元数据的真实组织情况,而日志文件则记录了该时刻以后所有的元数据操作。

HDFS启动时会读取元数据镜像文件和日志文件到内存,进行合并形成最新的内存元数据,随后将该元数据保存到磁盘,形成新的磁盘镜像文件和日志文件;在运行过程中,HDFS不再从内存导出元数据,而只是将元数据操作记录到日志文件中。

该机制的优点是:既保证了元数据内容不丢失,同时又最大程度地降低了备份元数据的开销;缺点是:在HDFS启动加载后,进行合并会消耗一定的时间。

具体实现时,所有与元数据镜像文件有关的操作由类FSDirectory的成员变量fsImage完成,它是一个FSImage类,所有与日志文件有关的操作由类FSImage的成员变量editLog完成,它是一个FSEditLog类。

 

2 Block

至此,我们讲到了和INode有关的几个类,通过INode我们可以知道文件的名称、创建时间、大小等属性,但这些信息对于访问某一个具体文件的内容来说是不够的。在此,我们引入HDFS中的另外一个概念——Block

Block是对于文件内容组织而言的,我们假设一个文件的长度大小为size,那么从文件的0偏移开始,按照固定的大小,顺序对文件进行划分并编号,划分好的每一个块就称之为一个BlockHDFS默认的Block大小为64MB,以一个256MB大小的文件为例,该文件一共有256/64=4Block

对于每一个BlockHDFS将其内容复制多份,以文件的形式保存到各个DataNode上,这些文件就称之为该Block的副本(Replica),HDFS中默认的副本数为3。对于1256MB的文件来说,它有4Block,每个Block对应有3个副本。因此,如果要访问文件指定偏移量的数据,首先可以根据Block的大小计算出该偏移所在的Block以及在该Block内的偏移,然后还要知道该Block对应的副本信息,其中最重要的信息是该副本所在的DataNode的信息。

INodeFile中设置了一个Block的数组(protected BlockInfo blocks[]=null;)来保存该文件所有的Block信息,并提供了相应的Block操作方法。每一个Block的信息由类BlockInfo来表示,类BlockInfo中的成员变量(privateObject[]triplets;)保存了该Block副本所在的DataNode的信息。每一个DataNode信息通过类DatanodeDescriptor进行描述,具体包括:容量、空间使用率、剩余容量、更新时间、主机名等。

至此,当一个客户端访问某一文件特定偏移量的内容时,HDFS首先根据路径信息找到该文件对应的INode,根据偏移计算出Block位置,在“protectedBlockInfoblocks[]=null;”中找到相应的BlockInfo,然后在“privateObject[]triplets;”找到副本所在DataNode的信息,然后选择其中的一个DataNode进行连接,获取相应的内容。同样,Block信息也是位于内存的,但是它不需要导出到磁盘进行存储,这是因为Block信息来源于底下各个DataNode的上报信息,这些信息由DataNode维护,因而不需要在NameNode上再进行保存。

3 BlockInfoDatanodeDescriptor

综上所述,我们可知道类INodeBlockInfoDatanodeDescriptorHDFS元数据的三个关键类,分别代表了三种管理对象:

l  INode代表的是文件系统基本元素:文件和目录;

l  BlockInfo代表的是文件内容对象;

l  DatanodeDescriptor代表的是具体存储对象。

前面所述的类FSDirectory实现了INode的管理,下面将对类BlockManagerNavigableMap<String,DatanodeDescriptor>datanodeMap进行说明,它们分别实现了对BlockInfoDatanodeDescriptor的管理。

BlockManager包含了一个成员变量“finalBlocksMapblocksMap;”,类BlocksMap实现了HDFS中所有Block的管理,它构建了一个Hash“privateMap<BlockInfo,BlockInfo>map;”来存储所有的BlockInfo,并实现Block的快速检索及其他操作,如:以Block为输入参数,获取该Block对应的INode、设置该Block对应的INode、删除该Block对应的INode、删除该Block对应的BlockInfo、获取该Block对应的BlockInfo等。

Hash“NavigableMap<String,DatanodeDescriptor>datanodeMap”实现了HDFS中所有DataNode的管理,它存储了HDFS中所有的DataNode,通过键值StorageID可以快速定位到相应的DataNode

4小结

至此我们从下向上对元数据的结构及相应的实现进行了说明,现在再从上到下梳理一遍:在HDFS中,由类FSNamesystem来代表总的元数据,由它对外提供统一的元数据操作接口,而这些接口的具体实现则是由它的成员变量及相关方法组合实现的,其中最重要的三个成员变量分别是:

l  publicFSDirectorydir

l  BlockManagerblockManager

l  NavigableMap<String,DatanodeDescriptor>datanodeMap

下面我们结合具体的代码对元数据结构进行分析。