`
cloudeagle
  • 浏览: 112620 次
  • 性别: Icon_minigender_1
  • 来自: 合肥
社区版块
存档分类
最新评论

HDFS文件元数据信息管理模块

 
阅读更多

转自:http://blog.csdn.net/sxf_824/article/details/4842196


设计思想

HDFS中对数据存储的最小单位为block,HDFS会将其存储的大文件打散成很多64M大小的block,并将这些block分别存储在集群中datanode机器上。服务器namenode主要存储文件元数据信息(文件目录结构,具体文件由那些block组成),该部分主要涉及的关键对象为:INode,INodeFile,INodeDirectory,Block,BlockInfo,FSDirectory

NameNode主要负责存储文件目录结构以及具体文件由那些block组成这些元数据基本信息,以上对象存在于namenode上。上述对象的主要关系如下。

INode

INode是抽象基类,从字面上能够了解到它表示一个文件属性目录结构中的一个节点,它包含的主要属性为:

//节点名称

protectedbyte[]name;

//父节点

protectedINodeDirectoryparent;

//最后修改时间

protectedlongmodificationTime;

//访问时间

protectedlongaccessTime;

//访问权限(同linux0777,0666之类)

privatelongpermission;

INodeFile

INodeFile继承自INode,表示文件节点。包含的主要属性如下:

//该文件中包含的所有Block,这些对象并不包含实际的文件block内容,主要的属性为blocks,后续通过blockID和时间戳信息可以找到这些Block存在哪台datanode机器上,客户端直接与该datanode建立链接,请求这个BockID对应的Block中具体文件内容数据(后续再讲,该字段为关键字段)

protectedBlockInfoblocks[]=null;

//block的复制个数

protectedshortblockReplication;

//缺省block大小

protectedlongpreferredBlockSize;

INodeDirectory

INodeDirectory同样继承自INode,表示文件目录节点,主要包含的属性如下:

//该文件目录下所有的子节点信息

privateList<INode>children;

Block

publicclassBlockimplementsWritable,Comparable<Block>

Block本身是一个抽象概念,就表示HDFS中一个最小存储单元,其主要包含的属性如下:

//BlockID标识

privatelongblockId;

//这个Block包含多少字节数据

privatelongnumBytes;

//一个时间戳,表示Block的版本

privatelonggenerationStamp;

注:这个Block对象只是一个抽象的概念(你可以理解为一个数据块的标识,一个存储单元的标识),这个对象并不包含实际Block数据。

Block信息的读取就是client通过网络传递一个序列化的block对象到DataNode,DataNode在本机中的读取这个Block对应的存储文件,返回给客户端。

Block是一个实现了Writable,Comparable<Block>的对象。说明Block对象可以进行序列化并通过网络进行传输,DataNode也可以通过HashMap的方式将Block与实际的存储文件进行对应关联。

BlockInfo

BlockInfo继承自Block,其包含的主要属性如下:

//该Block所属的文件

privateINodeFileinode;

/**

*Thisarraycontainstripletsofreferences.

*Foreachi-thdata-nodetheblockbelongsto

*triplets[3*i]isthereferencetotheDatanodeDescriptor

*andtriplets[3*i+1]andtriplets[3*i+2]arereferences

*tothepreviousandthenextblocks,respectively,inthe

*listofblocksbelongingtothisdata-node.

*/

privateObject[]triplets

triplets是一个关键字段。

通过triplets[3*i+1]triplets[3*i+2]可以得到某台datanode机器上所有的block列表,triplets[3*i+1]triplets[3*i+2]为BlockInfo类型对象

该项功能主要应用在DatanodeDescriptor实例的

privatevolatileBlockInfoblockList=null这个字段中

通过triplets[3*i]可以得到这个Block其他副本的所属datanode的位置,triplets[3*i]DatanodeDescriptor类型对象

抓住BlockInfo就抓住了整个HDFS按Block进行文件分布式存储的关键。

BlockInfo信息中不仅包括了一个Block都存储在哪些DataNode上,还包含了某个具体datanode上存储的所有Block信息,以及该block属于哪一个INodeFile。用户需要读取文件时首先通过INodeFile得到这个文件所有的Block---INodeFile中BlockInfo[]getBlocks()方法。通过BlockInfo又可以得到Block存储的DataNodeInfo列表。用户就可以向得到的DataNode列表的机器发送读取Block具体数据的请求(这部分具体实现后面再讲)。

在系统运行过程中,上述关键对象主要存储在内存中,也就是说HDFS的Namenode有一个内存镜像,其中的内容就是以上对象组成的树形结构,也许有人会问,如果Namenode当机会出现什么问题呢?这个问题问得好:)(具体的解决办法后续会详细讲解,目前先提一下)

HDFS为了能够保证数据安全性,完整性,采用和数据库一样的容灾机制,记录数据操作行为日志:对应的功能对象为FSEditLog

系统定时将内存中的文件系统结构镜像序列化到磁盘(FsImage),并删除当前的EditLog。如果系统机器重启,Namenode会从镜像文件中读取目录结构信息,同时执行EditLog中记录的操作,用以恢复最新的内存镜像。

FSDirectory

FSdirectory的一个主要作用是就是上述所说的从镜像文件中读取目录结构信息,同时执行EditLog中记录的操作,用以恢复最新的内存镜像。

FSdirectory另一个主要作用就是操作INodeDirectory,INodeFile对象,对文件系统的目录,文件以及文件包含的Block进行操作。FSdirectory有一个关键属性:rootDir这个对象是整个文件系统的根目录。

该对象涉及的主要方法如下:

voidloadFSImage(Collection<File>dataDirs,Collection<File>editsDirs,StartupOptionstartOpt)throwsIOException

booleanmkdirs(Stringsrc,PermissionStatuspermissions,

booleaninheritPermission,longnow)

BlockaddBlock(Stringpath,INode[]inodes,Blockblock)throwsIOException

private<TextendsINode>TaddChild(INode[]pathComponents,intpos,Tchild,longchildDiskspace,booleaninheritPermission)

throwsQuotaExceededException

INodeFileUnderConstruction

这个类继承自INodeFile,它的实例代表一个正在处于写入状态的文件,新文件的创建和文件的追加(文件追加目前HDFS支持不是很好)时都会使用到这个对象,INode有一个方法booleanisUnderConstruction(),如果这个方法返回true,表示这个对象目前处于写入状态,可以将这个对象引用转化为INodeFileUnderConstruction

当文件处于isUnderConstruction状态时,往往就和文件租约产生关联,因为文件的写入操作都会首先实现申请一个租约(租约有专门一章进行讲解),从FSNameSystem的startFileInternal()方法中的部分逻辑代码可以看出端倪

//首先判断文件是否存在,并且处于文件写入状态

if(myFile!=null&&myFile.isUnderConstruction())

{

//转换文件为INodeFileUnderConstruction类型

INodeFileUnderConstructionpendingFile=

(INodeFileUnderConstruction)myFile;

//Ifthefileisunderconstruction,thenitmustbeinour

//leases.Findtheappropriateleaserecord.

//如果文件处于写入状态一定有租约与之对应

Leaselease=

leaseManager.getLease(newStringBytesWritable(holder));

下面我们分析一下INodeFileUnderConstruction关键属性以及方法

INodeFile这个对象仅仅表示一个文件节点,它的大部分属性都是与BlockInfo相关的。

INodeFileUnderConstruction就会有一些文件创建以及追加时必要的信息,,详细如下:

//这个属性表示当前文件的租约属主是哪次应用

StringBytesWritableclientName=null;//leaseholder

StringBytesWritableclientMachine=null;

//client很可能也是datanode其中之一

DatanodeDescriptorclientNode=null;//ifclientisaclusternodetoo.

//这个属性主要应用于block的recover操作(该操作后续会详细描述

privateintprimaryNodeIndex=-1;//thenodeworkingonleaserecovery

//文件最后一个block需要写入的机器,这是很重要的属性,也是显而易见的,文件的追加写入一定是对最后一个Block进行操作

privateDatanodeDescriptor[]targets=null;//locationsforlastblock

privatelonglastRecoveryTime=0;

下面看一个很重要的方法,这个方法后续会详细描述。

voidassignPrimaryDatanode()

当文件写入过程中,很可能在某些datanode上写入失败,这就需要对block进行recover操作,而恢复操作中的主节点就是那些写入正常的datanode。

更多0

设计思想

HDFS中对数据存储的最小单位为block,HDFS会将其存储的大文件打散成很多64M大小的block,并将这些block分别存储在集群中datanode机器上。服务器namenode主要存储文件元数据信息(文件目录结构,具体文件由那些block组成),该部分主要涉及的关键对象为:INode,INodeFile,INodeDirectory,Block,BlockInfo,FSDirectory

NameNode主要负责存储文件目录结构以及具体文件由那些block组成这些元数据基本信息,以上对象存在于namenode上。上述对象的主要关系如下。

INode

INode是抽象基类,从字面上能够了解到它表示一个文件属性目录结构中的一个节点,它包含的主要属性为:

//节点名称

protectedbyte[]name;

//父节点

protectedINodeDirectoryparent;

//最后修改时间

protectedlongmodificationTime;

//访问时间

protectedlongaccessTime;

//访问权限(同linux0777,0666之类)

privatelongpermission;

INodeFile

INodeFile继承自INode,表示文件节点。包含的主要属性如下:

//该文件中包含的所有Block,这些对象并不包含实际的文件block内容,主要的属性为blocks,后续通过blockID和时间戳信息可以找到这些Block存在哪台datanode机器上,客户端直接与该datanode建立链接,请求这个BockID对应的Block中具体文件内容数据(后续再讲,该字段为关键字段)

protectedBlockInfoblocks[]=null;

//block的复制个数

protectedshortblockReplication;

//缺省block大小

protectedlongpreferredBlockSize;

INodeDirectory

INodeDirectory同样继承自INode,表示文件目录节点,主要包含的属性如下:

//该文件目录下所有的子节点信息

privateList<INode>children;

Block

publicclassBlockimplementsWritable,Comparable<Block>

Block本身是一个抽象概念,就表示HDFS中一个最小存储单元,其主要包含的属性如下:

//BlockID标识

privatelongblockId;

//这个Block包含多少字节数据

privatelongnumBytes;

//一个时间戳,表示Block的版本

privatelonggenerationStamp;

注:这个Block对象只是一个抽象的概念(你可以理解为一个数据块的标识,一个存储单元的标识),这个对象并不包含实际Block数据。

Block信息的读取就是client通过网络传递一个序列化的block对象到DataNode,DataNode在本机中的读取这个Block对应的存储文件,返回给客户端。

Block是一个实现了Writable,Comparable<Block>的对象。说明Block对象可以进行序列化并通过网络进行传输,DataNode也可以通过HashMap的方式将Block与实际的存储文件进行对应关联。

BlockInfo

BlockInfo继承自Block,其包含的主要属性如下:

//该Block所属的文件

privateINodeFileinode;

/**

*Thisarraycontainstripletsofreferences.

*Foreachi-thdata-nodetheblockbelongsto

*triplets[3*i]isthereferencetotheDatanodeDescriptor

*andtriplets[3*i+1]andtriplets[3*i+2]arereferences

*tothepreviousandthenextblocks,respectively,inthe

*listofblocksbelongingtothisdata-node.

*/

privateObject[]triplets

triplets是一个关键字段。

通过triplets[3*i+1]triplets[3*i+2]可以得到某台datanode机器上所有的block列表,triplets[3*i+1]triplets[3*i+2]为BlockInfo类型对象

该项功能主要应用在DatanodeDescriptor实例的

privatevolatileBlockInfoblockList=null这个字段中

通过triplets[3*i]可以得到这个Block其他副本的所属datanode的位置,triplets[3*i]DatanodeDescriptor类型对象

抓住BlockInfo就抓住了整个HDFS按Block进行文件分布式存储的关键。

BlockInfo信息中不仅包括了一个Block都存储在哪些DataNode上,还包含了某个具体datanode上存储的所有Block信息,以及该block属于哪一个INodeFile。用户需要读取文件时首先通过INodeFile得到这个文件所有的Block---INodeFile中BlockInfo[]getBlocks()方法。通过BlockInfo又可以得到Block存储的DataNodeInfo列表。用户就可以向得到的DataNode列表的机器发送读取Block具体数据的请求(这部分具体实现后面再讲)。

在系统运行过程中,上述关键对象主要存储在内存中,也就是说HDFS的Namenode有一个内存镜像,其中的内容就是以上对象组成的树形结构,也许有人会问,如果Namenode当机会出现什么问题呢?这个问题问得好:)(具体的解决办法后续会详细讲解,目前先提一下)

HDFS为了能够保证数据安全性,完整性,采用和数据库一样的容灾机制,记录数据操作行为日志:对应的功能对象为FSEditLog

系统定时将内存中的文件系统结构镜像序列化到磁盘(FsImage),并删除当前的EditLog。如果系统机器重启,Namenode会从镜像文件中读取目录结构信息,同时执行EditLog中记录的操作,用以恢复最新的内存镜像。

FSDirectory

FSdirectory的一个主要作用是就是上述所说的从镜像文件中读取目录结构信息,同时执行EditLog中记录的操作,用以恢复最新的内存镜像。

FSdirectory另一个主要作用就是操作INodeDirectory,INodeFile对象,对文件系统的目录,文件以及文件包含的Block进行操作。FSdirectory有一个关键属性:rootDir这个对象是整个文件系统的根目录。

该对象涉及的主要方法如下:

voidloadFSImage(Collection<File>dataDirs,Collection<File>editsDirs,StartupOptionstartOpt)throwsIOException

booleanmkdirs(Stringsrc,PermissionStatuspermissions,

booleaninheritPermission,longnow)

BlockaddBlock(Stringpath,INode[]inodes,Blockblock)throwsIOException

private<TextendsINode>TaddChild(INode[]pathComponents,intpos,Tchild,longchildDiskspace,booleaninheritPermission)

throwsQuotaExceededException

INodeFileUnderConstruction

这个类继承自INodeFile,它的实例代表一个正在处于写入状态的文件,新文件的创建和文件的追加(文件追加目前HDFS支持不是很好)时都会使用到这个对象,INode有一个方法booleanisUnderConstruction(),如果这个方法返回true,表示这个对象目前处于写入状态,可以将这个对象引用转化为INodeFileUnderConstruction

当文件处于isUnderConstruction状态时,往往就和文件租约产生关联,因为文件的写入操作都会首先实现申请一个租约(租约有专门一章进行讲解),从FSNameSystem的startFileInternal()方法中的部分逻辑代码可以看出端倪

//首先判断文件是否存在,并且处于文件写入状态

if(myFile!=null&&myFile.isUnderConstruction())

{

//转换文件为INodeFileUnderConstruction类型

INodeFileUnderConstructionpendingFile=

(INodeFileUnderConstruction)myFile;

//Ifthefileisunderconstruction,thenitmustbeinour

//leases.Findtheappropriateleaserecord.

//如果文件处于写入状态一定有租约与之对应

Leaselease=

leaseManager.getLease(newStringBytesWritable(holder));

下面我们分析一下INodeFileUnderConstruction关键属性以及方法

INodeFile这个对象仅仅表示一个文件节点,它的大部分属性都是与BlockInfo相关的。

INodeFileUnderConstruction就会有一些文件创建以及追加时必要的信息,,详细如下:

//这个属性表示当前文件的租约属主是哪次应用

StringBytesWritableclientName=null;//leaseholder

StringBytesWritableclientMachine=null;

//client很可能也是datanode其中之一

DatanodeDescriptorclientNode=null;//ifclientisaclusternodetoo.

//这个属性主要应用于block的recover操作(该操作后续会详细描述

privateintprimaryNodeIndex=-1;//thenodeworkingonleaserecovery

//文件最后一个block需要写入的机器,这是很重要的属性,也是显而易见的,文件的追加写入一定是对最后一个Block进行操作

privateDatanodeDescriptor[]targets=null;//locationsforlastblock

privatelonglastRecoveryTime=0;

下面看一个很重要的方法,这个方法后续会详细描述。

voidassignPrimaryDatanode()

当文件写入过程中,很可能在某些datanode上写入失败,这就需要对block进行recover操作,而恢复操作中的主节点就是那些写入正常的datanode。

分享到:
评论

相关推荐

    分布式文件系统HDFS

    HDFS的文件系统具有层次结构,它通过目录实现树状组织,同时记录文件权限和时间戳等元数据信息。不过,HDFS与众不同的地方在于,它是一个用户空间文件系统,不是内核模块,而是运行在用户空间以进程形式存在的文件...

    【HDFS篇06】HDFS数据读写流程1

    NameNode是HDFS的元数据管理节点,负责整个文件系统的命名空间和文件操作。 2. **检查与准备**:NameNode会检查目标文件是否已经存在,以及文件的父目录是否存在。如果一切正常,NameNode会返回一个确认信息,允许...

    Hadoop源代码分析之HDFS篇.

    NameNode是HDFS的元数据管理器,它维护文件系统命名空间,也就是文件和目录的层次结构,以及文件到数据块的映射。NameNode将这些元数据存储在内存中,以便快速查询,同时也定期将元数据持久化到硬盘上的日志文件中,...

    hadoop源码分析-HDFS部分

    HDFS的核心思想是主从结构,由NameNode作为中心节点管理文件系统的元数据,DataNode则是实际存储数据的工作节点。NameNode负责文件系统的命名空间操作,如打开、关闭、重命名文件或目录,以及块的分配与回收;...

    Hadoop(HDFS).docx

    - **FsImage文件**:保存了HDFS元数据的一个快照,用于快速恢复元数据状态; - **EditLog文件**:记录了自上次启动以来的所有元数据更改,仅进行追加操作; - **Secondary NameNode**:负责定期合并FsImage和EditLog...

    基于HDFS的视频播放

    NameNode作为元数据管理节点,存储文件系统的元数据,如文件名、文件块信息等;DataNode则是数据存储节点,实际存储数据块。文件被分割成多个块,并在DataNode上分散存储,以实现高可用性和容错性。 为了实现“在线...

    04 Hadoop实现原理B - 分布式文件系统HDFS.pdf

    除了文件元数据,文件系统还包括编码信息、格式化信息和可用空间等系统级元数据。 文件系统的安全性策略对于保护文件数据至关重要。早期的文件系统如FAT没有安全性策略,但现代文件系统,特别是UNIX和Windows,拥有...

    Hadoop源代码分析之HDFS篇

    HDFS采用了Master/Slave架构,其中NameNode作为主控节点,负责管理文件系统的元数据信息,而DataNode则是存储实际数据的节点。通过这种方式,HDFS能够高效地存储和处理PB级别的海量数据。此外,通过对NameNode和...

    Hadoop技术内幕 深入解析HADOOP COMMON和HDFS架构设计与实现原理.pdf

    2. 写入流程:客户端首先与NameNode交互,确定写入的块位置,然后直接向DataNode写入数据,最后更新NameNode的元数据信息。 3. 读取流程:客户端通过NameNode获取文件块的位置,然后并行从多个DataNode读取数据,...

    基于Hadoop的海量MP3文件存储架构

    2. 使用预处理模块,通过归类算法将小文件整合到Sequence File中,降低NameNode的元数据管理负担。 3. 引入高效索引机制,确保快速的文件检索能力,保持用户友好性。 4. 实验验证了该架构的有效性,提高了大规模MP3...

    spring4+hibernate5+quartz2+hdfs整合

    Hibernate 5 提供了性能优化、增强的JPA支持、更好的元数据源处理和更灵活的查询API。通过Hibernate,开发者可以使用HQL(Hibernate Query Language)或JPQL(Java Persistence Query Language)进行数据库查询,...

    HDFS详解②

    NameNode负责管理HDFS的元数据,包括文件系统命名空间和文件Block映射信息。元数据存于内存中,为提高持久化和一致性,采用了FsImage和Edits文件: - **FsImage**:初始的元数据快照,保存在磁盘上。 - **Edits**:...

    Hadoop技术内幕 深入解析HADOOP COMMON和HDFS架构设计与实现原理

    2. **高可用性**:通过NameNode和Secondary NameNode的组合,保证了元数据服务的高可用,即使主NameNode故障,也能快速切换到备选节点。 3. **容错机制**:每个数据块都有多个副本,如果某个节点故障,可以从其他...

    MimesisBench:HDFS 名称节点的元数据密集型基准测试

    1. **源代码文件(src目录)**:包含了MimesisBench的Java源代码,包括基准测试的主程序、元数据操作的模拟器、结果收集和分析模块等。 2. **构建脚本(build.gradle 或 pom.xml)**:如果是Gradle或Maven项目,这些...

    (完整版)hadoop常见笔试题答案.docx

    1. Hadoop的核心组成部分是HDFS(Hadoop Distributed File System),它是一个分布式文件系统,其中datanode是数据的实际存储节点,而namenode则是HDFS的元数据管理器,负责文件系统的命名空间和数据块映射。...

    博睿数据海量小文件分布式存储系统1

    Zookeeper作为集群管理工具,保存元数据信息,确保服务高可用。Client是用户接口,提供数据操作功能。Server包括RegionNode和DataNode,实现安全认证、副本管理、任务管理等功能。可视化监控与报警提供集群状态的...

    Hadoop技术内幕 深入解析HADOOP COMMON和HDFS架构设计与实现原理 高清 完整书签

    NameNode作为主节点,负责元数据管理,包括文件系统的命名空间和文件的块映射信息;DataNode则是从节点,存储实际的数据块,并执行数据读写操作。HDFS的设计原则包括数据冗余(通过复制策略保证数据可用性)、数据...

Global site tag (gtag.js) - Google Analytics