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,/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免费学习交流群:

时间: 2024-08-26 04:03:38

Hadoop 源代码分析(二四)FSNamesystem的相关文章

Hadoop源代码分析(四零)

有了上面的基础,我们可以来解剖DFSOutputStream了.先看构造函数: privateDFSOutputStream(String src, longblockSize, Progressable progress, intbytesPerChecksum) throws IOException DFSOutputStream(String src, FsPermissionmasked, boolean overwrite, shortreplication, long blockSi

Hadoop源代码分析

关键字: 分布式云计算 Google的核心竞争技术是它的计算平台.Google的大牛们用了下面5篇文章,介绍了它们的计算设施. GoogleCluster:http://research.google.com/archive/googlecluster.html Chubby:http://labs.google.com/papers/chubby.html GFS:http://labs.google.com/papers/gfs.html BigTable:http://labs.googl

Hadoop源代码分析(MapTask辅助类 I)

Hadoop源代码分析(MapTask辅助类 I)MapTask的辅劣类主要针对Mapper的输入和输出.首先我们来看MapTask中用的的Mapper输入,在类图中,返部分位于右上角.MapTask.TrackedRecordReader是一个Wrapper,在原有输入RecordReader的基础上,添加了收集上报统计数据的功能.MapTask.SkippingRecordReader也是一个Wrapper,它在MapTask.TrackedRecordReader的基础上,添加了忽略部分输

Hadoop源代码分析(完整版)-转载

Hadoop源代码分析(一) http://blog.csdn.net/huoyunshen88/article/details/8611629 关键字: 分布式云计算 Google的核心竞争技术是它的计算平台.Google的大牛们用了下面5篇文章,介绍了它们的计算设施. GoogleCluster:http://research.google.com/archive/googlecluster.html Chubby:http://labs.google.com/papers/chubby.h

Hadoop源代码分析(三二)

搞定ClientProtocol,接下来是DatanodeProtocol部分.接口如下: public DatanodeRegistration register(DatanodeRegistration nodeReg ) throws IOException 用亍DataNode向NameNode登记.输入和输出参数都是DatanodeRegistration,类图如下: 前面讨论DataNode的时候,我们已绊讲过了DataNode的注册过程,我们来看NameNode的过程.下面是主要步

Hadoop 源代码分析(二三)FSDirectory

下面我们来分析FSDirectory.其实分析FSDirectory 最好的地方,应该是介绍完INode*以后,FSDirectory 在INode*的基础上,保存了HDFS 的文件目录状态.系统加载FSImage 时,FSImage 会在FSDirectory 对象上重建文件目录状态,HDFS 文件目录状态的变化,也由FSDirectory 写日志,同时,它保存了文件名数据块的映射关系.FSDirectory 只有很少的成员变量,如下:finfinal FSNamesystem namesys

【原创】Kakfa utils源代码分析(二)

我们继续研究kafka.utils包 八.KafkaScheduler.scala 首先该文件定义了一个trait:Scheduler——它就是运行任务的一个调度器.任务调度的方式支持重复执行的后台任务或是一次性的延时任务.这个trait定义了三个抽象方法: 1. startup: 启动调度器,用于接收调度任务 2. shutdown: 关闭调度器.一旦关闭就不再执行调度任务了,即使是那些晚于关闭时刻的任务. 3. schedule: 调度一个任务的执行.方法接收4个参数 3.1 任务名称 3.

Hadoop源代码分析(MapReduce概论)

大家都熟悉文件系统,在对HDFS进行分析前,我们并没有花很多的时间去介绍HDFS的背景,毕竟大家对文件系统的还是有一定的理解的,而且也有很好的文档.在分析Hadoop的MapReduce部分前,我们还是先了解系统是如何工作的,然后再进入我们的分析部分.下面的图来自http://horicky.blogspot.com/2008/11/hadoop-mapreduce-implementation.html,是我看到的讲MapReduce最好的图. 以Hadoop带的wordcount为例子(下面

Hadoop源代码分析(包hadoop.mapred中的MapReduce接口)

前面已经完成了对org.apache.hadoop.mapreduce的分析,这个包提供了Hadoop MapReduce部分的应用API,用于用户实现自己的MapReduce应用.但这些接口是给未来的MapReduce应用的,目前MapReduce框架还是使用老系统(参考补丁HADOOP-1230).下面我们来分析org.apache.hadoop.mapred,首先还是从mapred的MapReduce框架开始分析,下面的类图(灰色部分为标记为@Deprecated的类/接口): 我们把包m