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萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章