Hadoop-INode的相关分析

2.1          文件系统中INODE的基本概念

inode译成中文就是索引节点,它用来存放档案及目录的基本信息,包含时间、档名、使用者及群组等。inode分为内存中的inode和文件系统中的inode,为了避免混淆,称前者为VFS inode 而后者以EXT2为代表,称为Ext2 inode。下面分别对VFS inodeExt2 inode做一下简单的描述:

(1)  VFS inode包含文件访问权限、属主、组、大小、生成时间、访问时间、最后修改时间等信息。它是linux管理文件系统的最基本单位,也是文件系统连接任何子目录、文件的桥梁。inode结构中的静态信息取自物理设备上的文件系统,由文件系统指定的函数填写,它只存在于内存中,可以通过inode缓存访问。虽然每个文件都有相应的inode结点,但是只有在需要的时候系统才会在内存中为其建立相应的inode数据结构,建立的inode结构将形成一个链表,我们可以通过遍历这个链表去得到我们需要的文件结点,VFS也为已分配的inode构造缓存和哈希表,以提高系统性能。inode结构中的struct inode_operations *i_op为我们提供了一个inode操作列表,通过这个列表提供的函数我们可以对VFS inode结点进行各种操作。每个inode结构都有一个i结点号i_ino,在同一个文件系统中每个i结点号是唯一的。

(2)  EXT2 inode用来定义文件系统的结构以及描述系统中每个文件的管理信息,每个文件都有且只有一个inode,即使文件中没有数据,其索引结点也是存在的。每个文件用一个单独的Ext2 inode结构来描述,而且每一个inode都有唯一的标志号。Ext2 inode为内存中的inode结构提供了文件的基本信息,随着内存中inode结构的变化,系统也将更新Ext2 inode中相应的内容。Ext2 inode对应的是Ext2_inode结构。

2.2  INODE

INODE类是一个抽象类,主要用于表示File/Directory的层次关系。

它为它的实现类定义了一系列的protected方法,它们包括:setPermissionStatus();设置文件的权限、getPermissionStatus();得到文件的权限、updatePermissionStatus();修改文件的权限。得到用户、设定用户等等。

同时还有部分抽象方法。如:abstract boolean isDirectory();用来判定这个INode是目录还是文件。abstract int collectSubtreeBlocksAndClear(List<Block> v);用于返回这个子树的所有文件数,当这个INode被删除的时候,清除这个子树下面的所有引用。

 

还有一些default方法。如void setLocalName(String name)设置文件名,得到INode的最后一次修改时间。INodeDirectory getParent();得到一个父的INodelong getModificationTime()。得到最后一次的修改时间。

INodeDirectoryINodeFileINode的两个主要实现类。这部分主要应用了合成模式,INodeFile是叶子节点,它没有内部的树结构。而INodeDirectory是树枝节点,它还可以包含子树。

INode的相关类如下所示:

      INode的类结构

 

2.3  INodeDirectory

INodeDirectory主要定义了一个INodeFile的目录结构,它有几个常用的构造函数

INodeDirectory(String name, PermissionStatus  permissions)INodeDirectory     (Permission Status permissions, long mTime) 其中long mTime是最后的修改时间。INodeDirectory(INodeDirectory other)这个构造函数的作用是,直接把当前目录复制成其它的目录。

问题4:int getExistingPathINodes(byte[][] components, INode[] existing)其中的components是一个二维数组,为什么要弄成byte型的?existing这个一维数组存储的是当前INode的路径么,为什么要限制这个数组的大小(难道是由于先前设定的子目录的个数)?这个函数返回的是现在存活的INode的节点的个数?

    INode[] getExistingPathINodes(String path) 函数中调用了this.getExistingPathINodes(components, inodes);  它又不返回个值,不是白调用了?

假设路径是/c1/c2/c3  根据/分隔成c1c2c3 这时String[] str1[0]=c1 ,str2[1]=c2, str3[2]=c3 static byte[][] getPathComponents(String[] strings)再把这一组String转化为byte[][]的二维数组。

2.4  INodeDirectoryWithQuota

   INodeDirectoryWithQuotaINodeDirectory的子类,它有一些定量的限制,如一个文件夹中的子文件夹的数量的限制

2.5  INodeFile

INodeFile中有三个最为重要的元数据,它们分别是:

protected BlockInfo blocks[] = null;//这个INodeFile所包含的块

protected short blockReplication;//复制的次数

protected long preferredBlockSize;//可以看出是对Block大小的一个定义

猜想:其中,blocks是一个BlockInfo的数组,它用来指向这个文件所在的第一个Block,而每一个Block又有三个指针域,这样通过链式的结构就能够完整地读取一个文件了。

这个类中大都是一些对这个文件所属的Block的操作,比较容易理解。

2.6  INodeFileUnderConstruction

这个类是INodeFile的子类,它表示的是正在构造中的INodeFileINodeFileINodeFileUnderConstruction这两个类中共有两个比较有意思的方法它们分别是:

INodeFileUnderConstruction toINodeFileUnderConstruction()INodeFile convert ToInodeFile()它们的作用分别是把一个INodeFile变为UnderConstruction和把一个INodeFileUnderConstruction变为一个INodeFile

 

发布了30 篇原创文章 · 获赞 34 · 访问量 8万+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章