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

源代码分析(二四)

时间:2024-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<a href=源代码分析(二四)%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);
租约管理器。


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

我要反馈

一键复制
图片预览
Weibo Article 1 Weibo Article 2 Weibo Article 3 Weibo Article 4 Weibo Article 5 Weibo Article 6 Weibo Article 7 Weibo Article 8 Weibo Article 9 Weibo Article 10 Weibo Article 11 Weibo Article 12 Weibo Article 13 Weibo Article 14 Weibo Article 15 Weibo Article 16 Weibo Article 17 Weibo Article 18 Weibo Article 19 Weibo Article 20 Weibo Article 21 Weibo Article 22 Weibo Article 23 Weibo Article 24 Weibo Article 25 Weibo Article 26 Weibo Article 27 Weibo Article 28 Weibo Article 29 Weibo Article 30 Weibo Article 31 Weibo Article 32 Weibo Article 33 Weibo Article 34 Weibo Article 35 Weibo Article 36 Weibo Article 37 Weibo Article 38 Weibo Article 39 Weibo Article 40