Hadoop学习笔记(四)
关于HDFS元数据的学习:
HDFS的元数据管理策略是FSImage+Editlog,采用元数据镜像文件FSImage保存某一时刻内存元数据的真实组织情况,而日志文件Editlog则记录了在该时刻以后的所有元数据操作。
优点:在保证元数据不丢失的前提下,最大程度降低了备份元数据的开销。
缺点:在HDFS启动时,加载需要一定时间。
元数据的分类:
形式上:
内存元数据和持久元数据
类型上:
1. 文件和目录自身属性信息,包括文件名,目录名,大小,创建时间,修改时间等等;
2. 文件内容存储信息,包括文件分块情况,副本个数,副本所在的Datanode等;
3. DataNode信息,用于Datanode的管理。
元数据的整体结构:
--类FSNamesystem ------代表总的元数据,对外提供统一接口,这些接口的实现由它的成员变量及相关方法组合实现。
------类FSDirectory ------实现对Inode的组织和操作,使用到了下面几个类
------|---类FSImage ------用于沟通内存和外存之间的桥梁,负责维护内存元数据镜像
------|---类FSEditLog ------用于日志记录操作
------|---类Inode 在HDFS中,每一个文件和目录都对应唯一的一个Inode,Inode是一个抽象类,定义一些公共变量,有四个Inode子类
------|---|---类INodeDirectory 代表目录类型的INode
------|---|---类INodeFile 代表文件类型的INode
------|---|---类INodeDirectoryWithQuota 是INodeDirectory的子类,代表有配额限制的目录
------|---|---类INodeFileUnderConstruction 是INodeFile的子类,标示正在写入的文件,是一个临时对象
------类BlockManager ---封装实现block管理,包含BlockMap对象
------|---类BlockMap ---实现HDFS所有Block的管理,构建一张hash表来存储所有的BlockInfo,实现Block的快速检索和其他操作
------|---|---类BlockInfo ---每一个Block的信息由BlockInfo来标示
------类NavigableMap<String,DatanodeDescriptor> 哈希表结构,实现了HDFS中所有Datanode的管理
-----类DatanodeDescriptor 是类DatanodeInfo的子类,描述Datanode信息的数据结构。
重点说明一下INodeFile和BlockInfo的关系:
在INodeFile中定义了一个BlockInfo类型的数组,表明了该文件所有分块的信息。
而在BlockInfo类中,定义了两个关键成员变量:
① private INodeFile inode; 用来说明该Block所对应的INode节点;
② Object[] triplets; 用来指出该Block对应三个副本所在的Datenode位置,并且可以指出其中某个Datanode中所存在的其他Block
现在简述一下大体的文件定位流程:
当一个用户访问某个文件特定偏移量的内容时——
1. HDFS根据路径找到文件对应的INode
2. 根据偏移量计算出Block的位置
3. 在BlockInfo数组中找到对应的BlockInfo
4. 在BlockInfo中triplets找到对应副本的Datanode位置
5. 和该Datanode通信执行操作
更进一步的,我们可以方便的根据triplets来查询所需Block存放的Datanode上的其他所有Block,也可以根据BlockInfo[]来查看该文件所对应的所有Block.
浙公网安备 33010602011771号