Hadoop 源代碼分析(二四)FSNamesystem

下面輪到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,/getp_w_picpath,/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);

租約管理器。

更多精彩內容請關注:http://bbs.superwu.cn 

關注超人學院微信二維碼:

關注超人學院java免費學習交流羣:


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章