hadoop hdfs总结 NameNode部分 1
??? 一、INode部分
??? 先畫了一下類圖,比較簡單。??
???
??? 1、INode是抽象類,有兩個子類,INodeFile和INodeDirectory,對了了file和directory。
??? INode定義了一些基本屬性,如name,parent,modificationTime,accessTime,還有ugi信息等。INode implements Comparable是可比較的,可以通過二分查找找到樹狀結構中對應的INode。
??? 此外,INode中重要的方法是public final ContentSummary computeContentSummary() ,計算該INode樹狀結構下的統計數據,如file數,dir數,length等。
? ? INode中還有一個重要方法?static byte[][] getPathComponents(String[] strings) 該方法的作用是獲取文件名稱,按照seperate 即"/",每個path存在一個byte[]數組中。
??? 2、INodeDirectory定義了Directory,基本屬性有private List<INode> children 是所有樹狀結構底下的INodeFile和INodeDirectory,INodeDirectory的一些重要方法:
??????? (1)INode removeChild(INode node)?? 通過二分查找找到對應的子INode對象,從children中刪除,并返回該對象
??????? (2)void replaceChild(INode newChild)? 同上,只不過是替換
??????? (3)private INode getChildINode(byte[] name) 通過二分查找獲得INode對象
??????? (4)<T extends INode> T addChild(final T node, boolean inheritPermission) 插入一個INode對象到隊列中,并且按順序插入,其中重要的代碼是????????
int low = Collections.binarySearch(children, node.name);if(low >= 0)return null;node.parent = this;? ? children.add(-low - 1, node);?
?????? (5)<T extends INode> INodeDirectory addToParent? 插入一個INode到相關的parent中,并且更新該parent對應的INode children隊列
?????? (6)DirCounts spaceConsumedInTree(DirCounts counts)? 計算磁盤使用空間,遞歸計算
???????? (7)int collectSubtreeBlocksAndClear(List<Block> v) 將所有樹狀結構下的block返回,用于刪除以后對block做處理。
? ? ? ?(8)int getExistingPathINodes(byte[][] components, INode[] existing) 這個方法個人認為比較重要,作用是從components[]中獲取存在的INode數組,意思是components是一個全路徑path,有可能存在該路徑,也可能不存在,通過該函數找到存在的path,形成INode對象返回
int getExistingPathINodes(byte[][] components, INode[] existing) {assert compareBytes(this.name, components[0]) == 0 :
"Incorrect name " + getLocalName() + " expected " + components[0];
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;
}
return count;
}
?? ?3、INodeDirectoryWithQuota 繼承自INodeDirectory,加入了Quota,如果超出Quota會拋出相應的ExceededException 異常。
?? 4、INodeFile INodeFile對應了Block,HDFS對每個File復制了多分副本,通過策略放在不同的DataNode上,同時每個INodeFile對應了多個Block,默認情況下每個Block64M。
??????? INodeFile中主要的屬性有protected BlockInfo blocks[],protected short blockReplication,protected long preferredBlockSize
??????? blocks在blockMap中會詳細介紹,就是該INodeFile對應的Block。
??????? INodeFile中的一些重要方法:
?????? (1)Block getLastBlock()??? 獲得最后一個Block,由于目前HDFS支持append,所以獲得最后一個Block進行append操作
?????? (2)void addBlock(BlockInfo newblock)? 向該INodeFile對應的Block數組中最后位置添加一個Block
?????? (3)int collectSubtreeBlocksAndClear(List<Block> v)? 將所有Block放在列表中,如刪除某個目錄下所有文件,就需要獲得所有Block,在BlockMap中進行刪除。??????
int collectSubtreeBlocksAndClear(List<Block> v) {parent = null;for (Block blk : blocks) {v.add(blk);}blocks = null;return 1;}?????? 設置parent=null 使得資源得以通過GC回收。
???? (4)Block getPenultimateBlock() 獲得倒數第二個Block
??? 5、INodeFileUnderConstruction 說明該INodeFile對應的Block正在寫入DataNode。INodeFile處于UnderConstruction狀態有幾種情況,如正寫入文件,lease recovery等。當然只能對最后一個Block進行append。
???????? 主要屬性有?String clientName; 正在寫入的Client名稱。? private int primaryNodeIndex = -1; 當進行leaseRecovery時,會選出primary通過primary向其它DataNode發送Recovery信息。
???????? private DatanodeDescriptor[] targets = null;?? target是最后一個Block對應的DataNode位置,該target由一定算法獲得。在后面會分析。
??????? 重要的方法有:
?????? (1)void setTargets(DatanodeDescriptor[] targets)? 設置該INodeFile對應Block所在的DataNode(DatanodeDescriptor是DataNode的抽象)
?????? (2)void addTarget(DatanodeDescriptor node)? 將新的DataNode加入到target中
?????? (3)INodeFile convertToInodeFile() 如果DataNode獲得所有數據并成功回報給NameNode后,將INodeFIleUnderConstruction狀態轉化為正常狀態。
???????? (4) void removeBlock(Block oldblock) 將最后一個Block刪除,原因可能是由于Block傳輸過程中出錯,被abandon掉,也可能是進行recovery中發現時間戳不一致。
?????? (5)synchronized void setLastBlock(BlockInfo newblock, DatanodeDescriptor[] newtargets)? 設置最后一個Block,并且設置對應的DataNode,在NameNode的Append中使用。
?????? (6)void assignPrimaryDatanode()?? 在LeaseRecovery過程中使用,到LeaseRecovery過程會詳細解釋,這個方法就是找到一個alive的DataNode作為primary,來進行Lease Recovery。
?
????? INode部分至此結束,INode+BlockMap構成了NameNode中主要的數據結構,其它的操作都是圍繞這這兩個數據結構進行處理,后面將會總結BlockMap。
轉載于:https://www.cnblogs.com/sidmeng/archive/2012/03/12/2390732.html
總結
以上是生活随笔為你收集整理的hadoop hdfs总结 NameNode部分 1的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: [wp7游戏]wp7~~飞行射击精品游戏
- 下一篇: Js中的callback机制