`
sid1211
  • 浏览: 51550 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

Hdfs INode结构说明

阅读更多
INode类在Namenode中代表了一个树状结构即Namespace,表示的是目录和文件的抽象,INode类是一个抽象类,INodeFile和INodeDirectory是具体实现。
1. INode的变量有
protected byte[] name;
protected INodeDirectory parent;
protected long modificationTime;
protected long accessTime;
private long permission;

name表示的是该文件或目录名称,parent代表其父节点,modificationTime为修改时间,accessTime是最后访问时间,permission是权限,这些属性都是仿照unix系统的文件信息显示的。
2. boolean isRoot() 方法
检查是否是根节点,方法是
return name.length == 0;
3. public final ContentSummary computeContentSummary()
计算这个INode对象树状目录下的所有文件数,block占据的空间等
4. static String[] getPathNames(String path)
将整体目录转化为单一目录数组,举例来说,对于\test\a
返回一个String数组,长度是2,第一个元素是test,第二个元素是a
5. static byte[][] getPathComponents(String[] strings)
将4中的String数组转化为byte[][]数组
6. boolean removeNode()
将INode对象从树状目录结构中删除,方法是首先找到其父节点,将其从父节点中删除,在从该INode对象中删除其父节点,一边垃圾回收。
parent.removeChild(this);
parent = null;


     INodeDirectory表示了对目录结构的抽象
1. private List<INode> children;
子结点结构,所有该INode底下的子目录和子文件。
2. INode removeChild(INode node)
删除子结点,根据二分法删除。
3. void replaceChild(INode newChild)
将同名子结点替换为新的结点
4. private INode getChildINode(byte[] name)
根据二分法获得子结点INode
5. INode getNode(String path)
这是一个对外接口,调用的是private INode getNode(byte[][] components)
最后调用的功能函数是getExistingPathINodes(components, inode);
6. int getExistingPathINodes(byte[][] components, INode[] existing)
这个函数十分重要,是从目录结构中查询特定的文件名或目录名。
代码为:
INode curNode = this;
int count = 0;
int index = existing.length - components.length;
if (index > 0)
  index = 0;
while ((count < components.length) && (curNode != null)) {
  if (index >= 0)
    existing[index] = curNode;
  if (!curNode.isDirectory() || (count == components.length - 1))
    break; // no more child, stop here
  INodeDirectory parentDir = (INodeDirectory)curNode;
  curNode = parentDir.getChildINode(components[count + 1]);
  count += 1;
  index += 1;
}
一步一步遍历,通过getChildINode获得是否存在查询的INode对象,最后返回的如果存在则返回由String数据定义的文件名对应的INode对象,如果不存在则返回null值。
7. INode[] getExistingPathINodes(String path)
方法与6相同,区别是返回的是INode[]数组。
8. <T extends INode> T addChild(final T node, boolean inheritPermission)
有序插入结点,向child位置的相应部分(根据二分法获得位置)插入INode
9. <T extends INode> INodeDirectory addToParent()
根据参数将INode对象插入到相应位置。


INodeFile表示对文件的抽象
1. protected BlockInfo blocks[] = null;
每个文件分为多个块保存,每个块大小一定,如64M。
2. protected short blockReplication;
每个块都有一定的副本个数,放置到不同的datanode中
3. protected long preferredBlockSize;
块的大小
4. Block getLastBlock()
获得最后一个块,用于append等操作
5. void addBlock(BlockInfo newblock)
因为每个块的大小都比较大,所以块的个数都比较多。这样块数据用的是数组这种数据结构,当增加新的块后开辟一个新的数组空间,大小+1,将原数组复制到新的数组中,新添加的block放到最后。具体方法为:
int size = this.blocks.length;
BlockInfo[] newlist = new BlockInfo[size + 1];
System.arraycopy(this.blocks, 0, newlist, 0, size);
newlist[size] = newblock;
this.blocks = newlist;
6. int collectSubtreeBlocksAndClear(List<Block> v)
将目录下的所有block清除,并放置在List中。
7. long[] computeContentSummary(long[] summary)
计算信息,见INode说明。
8. Block getPenultimateBlock()
获得倒数第二个块。

INodeFileUnderConstruction表示文件正在被写入新的块,删除块等独占操作,需要同步,这里同步采用的是租约(lease)
1. String clientName;
private final String clientMachine;
private final DatanodeDescriptor clientNode;
表示的是正在进行操作的client,也就是拥有这个块lease(租约)的client。租约稍后再写。
2. private DatanodeDescriptor[] targets = null;
最后一个块对应的Datanode位置信息等。
3. void addTarget(DatanodeDescriptor node)
向最后一个块加入一个datanode target
4. INodeFile convertToInodeFile()
将INodeFileUnderconstrutor转化为INodeFile对象
5. void removeBlock(Block oldblock) throws IOException
将最后一个块删除,只能删除最后一个块!
6. synchronized void setLastBlock(BlockInfo newblock, DatanodeDescriptor[] newtargets)
将newblock设置为新的最后的一个block,同时更新target为newtargets
7. void assignPrimaryDatanode()
设置存活的一个Datanode为主结点,并且更新其租约。
分享到:
评论

相关推荐

    hdfs源码.zip

    1.1.1 HDFS体系结构 1 1.1.2 HDFS基本概念 2 1.2 HDFS通信协议 4 1.2.1 Hadoop RPC接口 4 1.2.2 流式接口 20 1.3 HDFS主要流程 22 1.3.1 HDFS客户端读流程 22 1.3.2 HDFS客户端写流程 24 1.3.3 HDFS...

    Hadoop技术-HDFS目录树.pptx

    HDFS的目录树结构由INode节点构建,这些节点包含了文件和目录的基本信息。INodeFile和INodeDirectory分别对应文件和目录,它们扩展了基本的INode功能,以满足特定需求。通过理解和掌握HDFS的目录树结构,用户可以更...

    Hadoop学习总结之二:HDFS读写过程解析

    - 这个树状结构由`INodeDirectoryWithQuota`和`INodeFile`等类构成,其中`INodeDirectoryWithQuota`继承自`INodeDirectory`,后者包含一个`List&lt;INode&gt;`,用于存储子节点信息。如果子节点为目录,则类型为`...

    高可用性的HDFS:Hadoop分布式文件系统深度实践

    2.2.1 INode 2.2.2 Block 2.2.3 BlockInfo和DatanodeDescriptor 2.2.4 小结 2.2.5 代码分析——元数据结构 2.3 磁盘元数据文件 2.4 Format情景分析 2.5 元数据应用场景分析 第3章 Hadoop的元数据备份方案 3.1 运行...

    Hadoop学习总结之二:HDFS读写过程解析.doc

    `INodeDirectory`是一个抽象的文件系统目录节点,包含一个`INode`链表,每个`INode`可以表示文件或子目录。`INodeDirectoryWithQuota`是具有配额限制的目录节点,继承自`INodeDirectory`。 3. **DFSInputStream的...

    13、HDFS Snapshot快照

    1. 快照定义:快照是数据存储在某一特定时刻的状态记录,保存了文件系统的结构和内容。 2. 快照与备份的区别:备份通常涉及对整个文件系统或选定部分的完全拷贝,而快照则创建了一个逻辑视图,反映了数据在某个时间...

    hadoop-hdfs:Hadoop分布式文件系统hdfs代码分析

    hadoop-hdfs Hadoop分布式文件系统hdfs代码分析目录介绍Datanode-数据块基本结构主要介绍了HDFS中第二关系块结构,数据块到数据中断的映射关系。退役-中断退款主要介绍了数据异步下线取消机制。INode-文件目录结构...

    ImageSummary:从hdfs映像获取摘要信息,而无需解析每个inode以避免使用过多的内存

    很多时候我们想要解析一个FSImage文件分析当时的hdfs,但是我们并不想获得所有的inode与block,而只是想知道summary,比如有多少个INodes,有多少个Blocks,多少个Directory,多少个Files。如果使用OfflineImageViewr...

    Hadoop源代码分析(一九)

    在深入分析Hadoop源代码的过程中,我们聚焦于`INode*`类,这些类构成了Hadoop分布式文件系统(HDFS)文件层次结构的基础。`INode`作为一个抽象类,是目录(`INodeDirectory`)和文件(`INodeFile`)的父类。`...

    上传文件到Hadoop失败的原因分析及解决方法.pdf

    在 Tomcat 中观察运行结果,可以发现出现了 Exception“org.apache.hadoop.security.AccessControlException: Permission denied: user=bikun,access=WRITE, inode="/user":user:supergroup:drwxr-xr-x”。...

    Hadoop源代码分析(二八)

    在内部,NameNode首先会验证权限和参数,接着通过查找INode结构找到对应的文件节点。如果找到的INode是文件类型,它会获取文件的Block列表。如果Block列表为空,表示请求的INode不是一个文件,所以返回null。否则,...

    源代码分析(一九).docx

    1. **INode类**:`INode`是Hadoop HDFS(Hadoop Distributed File System)中的基本抽象,代表文件系统树中的一个节点,可以是目录或文件。`INode`包含文件名、修改时间和访问时间、父目录引用以及权限信息。权限...

    大数据练习题.docx

    大数据技术的“数据存储和管理”技术层面的功能是指利用分布式文件系统、数据仓库、关系数据库等实现对结构化、半结构化和非结构化海量数据的存储和管理。 Hadoop 的特性 Hadoop 是一个大数据处理框架,它具有高...

    Hadoop课件

    - Linux文件系统采用传统的文件系统结构,而HDFS设计用于大规模数据集的大规模分布式存储。 - HDFS为了提高数据可靠性,每个文件块都会被复制多份存储在不同的DataNode上。 - HDFS优化了数据的流式访问,适合...

    分布式文件系统与传统文件系统的比较研究.pdf

    Linux文件系统的存储结构是基于块的,数据被分割成块后存放在磁盘上,并通过索引节点(inode)来跟踪这些块。 相比之下,分布式文件系统如HDFS,其核心构架设计用于处理大规模数据集,数据被分布存储在多个服务器上...

    05丨文件系统原理:如何用1分钟遍历一个100TB的文件?.pdf

    然而,传统的inode结构对于超大型文件(如100TB)来说存在局限,因为它们的索引数量有限,限制了文件的最大大小。 为了解决大文件遍历的问题,可以采用RAID(独立硬盘冗余阵列)技术。RAID通过将数据分布在多个硬盘...

    git-test:git测试

    hadoop-hdfs Hadoop分布式文件系统hdfs代码分析目录介绍 Datanode-数据块基本结构主要介绍了HDFS中第二关系块结构,数据块到数据中断的映射关系。退役-中断退款主要介绍了数据异步下线取消机制。 INode-文件目录结构...

    【大数据学习资料】大数据框架知识点总结.pdf

    Fsimage文件是HDFS文件系统元数据的一个永久性检查点,其中包含HDFS文件系统的所有目录和文件inode的序列化信息。Edits文件存放HDFS文件系统的所有更新操作的逻辑,文件系统客户端执行的所有写操作首先会记录大Edits...

    大规模分布式文件系统元数据管理系统设计.pptx

    例如,Lustre和HDFS这样的系统依赖于单一服务器来处理元数据,这在面对大量小文件时效率低下,因为元数据操作成为性能瓶颈。 为了解决这一问题,提出了两种主要解决方案:IndexFS和SlimFS。IndexFS是一个中间件系统...

    Hadoop源代码分析(二三)

    - 用途:用于加载目录树结构。 - 实现细节:该方法会调用`FSImage`的方法来完成持久化信息的导入,之后将成员变量`ready`设置为`true`。`loadFSImage`在`FSNamesystem.java`的`initialize`方法中被调用,是系统...

Global site tag (gtag.js) - Google Analytics