Hadoop 源代码分析(二四)FSNamesystem,hadoopfsnamesystem


下面轮到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);

租约管理器。

更多精彩内容请关注:http://bbs.superwu.cn

关注超人学院微信二维码:

关注超人学院java免费学习交流群:

相关内容