下面輪到FSNamesystem 出場了。FSNamesystem.java 一共有4573 行,而整個namenode 目錄下全部的Java 程序總共也只有16876
行,把FSNamesystem 搞定了,NameNode 也就基本搞定。
FSNamesystem 是NameNode 實際記錄信息的地方,保存在FSNamesystem 中的數據有:
文件名數據塊列表(存放在FSImage 和日誌中)
合法的數據塊列表(上面關係的逆關係)
數據塊DataNode(只保存在內存中,根據DataNode 發過來的信息動態創建)
DataNode 上保存的數據塊(上面關係的逆關係)
最近發送過心跳信息的DataNode(LRU)
咱們先來分析FSNamesystem 的成員變量。
privatprivate boolean isPermissionEnabled;
是否打開權限檢查,能夠經過配置項dfs.permissions 來設置。
private UserGroupInformation fsOwner;
本地文件的用戶文件屬主和文件組,能夠經過hadoop.job.ugi 設置,若是沒有設置,那麼將使用啓動HDFS 的用戶(經過whoami 得到)和該用戶
所在的組(經過groups 得到)做爲值。
private String supergroup;
對應配置項dfs.permissions.supergroup,應用在defaultPermission 中,是系統的超級組。
private PermissionStatus defaultPermission;
缺省權限,缺省用戶爲fsOwner,缺省用戶組爲supergroup,缺省權限爲0777,能夠經過dfs.upgrade.permission 修改。
private long capacityTotal, capacityUsed, capacityRemaining;
系統總容量/已使用容量/剩餘容量
private int totalLoad = 0;
系統總鏈接數,根據DataNode 心跳信息跟新。
privatprivate long pendingReplicationBlocksCount, underReplicatedBlocksCount, scheduledReplicationBlocksCount;
分別是成員變量pendingReplications(正在複製的數據塊),neededReplications(須要複製的數據塊)的大小,
scheduledReplicationBlocksCount 是當前正在處理的複製工做數目。
public FSDirectory dir;
指向系統使用的FSDirectory 對象。
BlocksMap blocksMap = new BlocksMap();
保存數據塊到INode 和DataNode 的映射關係
public CorruptReplicasMap corruptReplicas = new CorruptReplicasMap();
保存損壞(如:校驗沒經過)的數據塊到對應DataNode 的關係, CorruptReplicasMap 類圖以下,類只有一個成員變量,保存Block 到一個
DatanodeDescriptor 的集合的映射和這個映射上的一系列操做:
Map<String, DatanodeDescriptor> datanodeMap = new TreeMap<String, DatanodeDescriptor>();
保存了StorageID � DatanodeDescriptor 的映射,用於保證DataNode 使用的Storage 的一致性。
private Map<String, Collection<Block>> recentInvalidateSets
保存了每一個DataNode 上無效但還存在的數據塊( StorageID � ArrayList<Block>)。
Map<String, Collection<Block>> recentInvalidateSets
保存了每一個DataNode 上有效,但須要刪除的數據塊( StorageID � TreeSet<Block>),這種狀況可能發生在一個DataNode 故障後恢復後, 上
面的數據塊在系統中副本數太多,須要刪除一些數據塊。
HttpServer infoServer;
int infoPort;
Date startTime;
用於內部信息傳輸的HTTP 請求服務器( Servlet 的容器)。如今有/fsck,/getimage,/listPaths/*,/data/*和/fileChecksum/*,咱們
後面還會繼續討論。
ArrayList<DatanodeDescriptor> heartbeats;
全部目前活着的DataNode,線程HeartbeatMonitor 會按期檢查。
private UnderReplicatedBlocks neededReplications
須要進行復制的數據塊。UnderReplicatedBlocks 的類圖以下,它實際上是一個數組,數組的下標是優先級(0 的優先級最高,若是數據塊只有一個副
本,它的優先級是0),數組的內容是一個Block 集合。UnderReplicatedBlocks 提供一些方法,對Block 進行增長,修改,查找和刪除。
private PendingReplicationBlocks pendingReplications;
保存正在複製的數據塊的相關信息。PendingReplicationBlocks 的類圖以下:
其中,pendingReplications 保存了全部正在進行復制的數據塊,使用Map 是須要一些附加的信息PendingBlockInfo。這些信息包括時間戳,
用於檢測是否已經超時,和如今進行復制的數目numReplicasInProgress。timedOutItems 是超時的複製項,超時的複製項在FSNamesystem 的
processPendingReplications 方法中被刪除,並重新複製。timerThread 是用於檢測複製超時的線程的句柄,對應的線程是
PendingReplicationMonitor 的一個實例,它的run 方法每隔一段會檢查是否有超時的複製項,若是有,將該數據塊加到timedOutItems 中。
Timeout 是run 方法的檢查間隔, defaultRecheckInterval 是缺省值。PendingReplicationBlocks 和PendingBlockInfo 的方法都很簡
單。
publipublic LeaseManager leaseManager = new LeaseManager(this);
java
租約管理器。node
更多精彩內容請關注:http://bbs.superwu.cn web
關注超人學院微信二維碼:數組
關注超人學院java免費學習交流羣:服務器