首页 百科知识 源代码分析(二四)

源代码分析(二四)

时间:2023-09-22 百科知识 版权反馈
【摘要】:下面轮到FSNamesystem出场了。privateString supergroup; 对应配置项dfs.permissions.supergroup,应用在defaultPermission中,是系统的超级组。privatePermissionStatus defaultPermission; 缺省权限,缺省用户为fsOwner,缺省用户组为supergroup,缺省权限为0777,可以通过dfs.upgrade.permission修改。privatelongpendingReplicationBlocksCount,underReplicatedBlocksCount,scheduledReplicationBlocksCount; 分别是成员变量pendingReplications,neededReplications的大小,scheduledReplicationBlocksCount是当前正在处理的复制工作数目。publicFSDirectory dir; 指向系统使用的FSDirectory对象。ArrayListheartbeats; 所有目前活着的DataNode,线程HeartbeatMonitor会定期检查。UnderReplicatedBlocks提供一些方法,对Block进行增加,修改,查找和删除。privatePendingReplicationBlocks pendingReplications; 保存正在复制的数据块的相关信息。

下面轮到FSNamesystem出场了。FSNamesystem.java一共有4573行,而整个namenode目录下所有的Java程序总共也只有16876行,把FSNamesystem搞定了,NameNode也就基本搞定。

FSNamesystem是NameNode实际记录信息的地方,保存在FSNamesystem中的数据有:

l          文件名à数据块列表(存放在FSImage和日志中)

l          合法的数据块列表(上面关系的逆关系)

l          数据块àDataNode(只保存在内存中,根据DataNode发过来的信息动态建立)

l          DataNode上保存的数据块(上面关系的逆关系)

l          最近发送过心跳信息的DataNode(LRU)

我们先来分析FSNamesystem的成员变量。

  privateboolean isPermissionEnabled;
是否打开权限检查,可以通过配置项dfs.permissions来设置。

 

  privateUserGroupInformation fsOwner;
本地文件的用户文件属主和文件组,可以通过hadoop.job.ugi设置,如果没有设置,那么将使用启动HDFS的用户(通过whoami获得)和该用户所在的组(通过groups获得)作为值。

 

  privateString supergroup;
对应配置项dfs.permissions.supergroup,应用在defaultPermission中,是系统的超级组。

 

  privatePermissionStatus defaultPermission;
缺省权限,缺省用户为fsOwner,缺省用户组为supergroup,缺省权限为0777,可以通过dfs.upgrade.permission修改。

 

  privatelong capacityTotal, capacityUsed,capacityRemaining;
系统总容量/已使用容量/剩余容量

 

  privateint totalLoad = 0;
系统总连接数,根据DataNode心跳信息跟新。

 

  privatelongpendingReplicationBlocksCount,underReplicatedBlocksCount,scheduledReplicationBlocksCount;
分别是成员变量pendingReplications(正在复制的数据块),neededReplications(需要复制的数据块)的大小,scheduledReplicationBlocksCount是当前正在处理的复制工作数目。

 

  publicFSDirectory dir;
指向系统使用的FSDirectory对象。

 

  BlocksMap blocksMap= newBlocksMap();
保存数据块到INodeDataNode的映射关系

public CorruptReplicasMap corruptReplicas = newCorruptReplicasMap();
保存损坏(如:校验没通过)的数据块到对应DataNode的关系,CorruptReplicasMap类图如下,类只有一个成员变量,保存Block到一个DatanodeDescriptor的集合的映射和这个映射上的一系列操作:


mhtml:file://I:\技术文章下载\2010-4-23整理到notebook\Hadoop汇总2010-4-22\Hadoop源码分析\Hadoop源代码分析(二四)%20-%20-%20JavaEye技术网站.mht!http://caibinbupt.javaeye.com/upload/attachment/61411/495805b6-aad4-3983-b7f7-a3d80949f266.jpg
 

 

 Map<String, DatanodeDescriptor> datanodeMap = newTreeMap<String, DatanodeDescriptor>();
保存了StorageID à DatanodeDescriptor的映射,用于保证DataNode使用的Storage的一致性。

 

  privateMap<String, Collection<Block>> recentInvalidateSets
保存了每个DataNode上无效但还存在的数据块(StorageIDà ArrayList<Block>)。

  Map<String,Collection<Block>> recentInvalidateSets
保存了每个DataNode上有效,但需要删除的数据块(StorageIDà TreeSet<Block>),这种情况可能发生在一个DataNode故障后恢复后,上面的数据块在系统中副本数太多,需要删除一些数据块。

 

 HttpServer infoServer;

  intinfoPort;

 Date startTime;
用于内部信息传输的HTTP请求服务器(Servlet的容器)。现在有/fsck/getimage/listPaths/*/data/*/fileChecksum/*,我们后面还会继续讨论。

 

  ArrayList<DatanodeDescriptor>heartbeats;
所有目前活着的DataNode,线程HeartbeatMonitor会定期检查。

privateUnderReplicatedBlocks neededReplications
需要进行复制的数据块。UnderReplicatedBlocks的类图如下,它其实是一个数组,数组的下标是优先级(0的优先级最高,如果数据块只有一个副本,它的优先级是0),数组的内容是一个Block集合。UnderReplicatedBlocks提供一些方法,对Block进行增加,修改,查找和删除。


mhtml:file://I:\技术文章下载\2010-4-23整理到notebook\Hadoop汇总2010-4-22\Hadoop源码分析\Hadoop源代码分析(二四)%20-%20-%20JavaEye技术网站.mht!http://caibinbupt.javaeye.com/upload/attachment/61409/f3c0e0b2-0428-37dd-807a-246180da66a7.jpg

  privatePendingReplicationBlocks pendingReplications;
保存正在复制的数据块的相关信息。PendingReplicationBlocks的类图如下:


mhtml:file://I:\技术文章下载\2010-4-23整理到notebook\Hadoop汇总2010-4-22\Hadoop源码分析\Hadoop源代码分析(二四)%20-%20-%20JavaEye技术网站.mht!http://caibinbupt.javaeye.com/upload/attachment/61407/3c213e8c-0b42-3d43-852b-9e77433eb66c.jpg
 

 

其中,pendingReplications保存了所有正在进行复制的数据块,使用Map是需要一些附加的信息PendingBlockInfo。这些信息包括时间戳,用于检测是否已经超时,和现在进行复制的数目numReplicasInProgresstimedOutItems是超时的复制项,超时的复制项在FSNamesystemprocessPendingReplications方法中被删除,并从新复制。timerThread是用于检测复制超时的线程的句柄,对应的线程是PendingReplicationMonitor的一个实例,它的run方法每隔一段会检查是否有超时的复制项,如果有,将该数据块加到timedOutItems中。Timeoutrun方法的检查间隔,defaultRecheckInterval是缺省值。PendingReplicationBlocksPendingBlockInfo的方法都很简单。

 

  publicLeaseManager leaseManager = new LeaseManager(this);
租约管理器。


免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。

我要反馈