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 请求server( 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免费学习交流群:
Hadoop 源码分析(二四)FSNamesystem的更多相关文章
- Hadoop源码分析之数据节点的握手,注册,上报数据块和心跳
转自:http://www.it165.net/admin/html/201402/2382.html 在上一篇文章Hadoop源码分析之DataNode的启动与停止中分析了DataNode节点的启动 ...
- Tomcat源码分析二:先看看Tomcat的整体架构
Tomcat源码分析二:先看看Tomcat的整体架构 Tomcat架构图 我们先来看一张比较经典的Tomcat架构图: 从这张图中,我们可以看出Tomcat中含有Server.Service.Conn ...
- Fresco 源码分析(二) Fresco客户端与服务端交互(1) 解决遗留的Q1问题
4.2 Fresco客户端与服务端的交互(一) 解决Q1问题 从这篇博客开始,我们开始讨论客户端与服务端是如何交互的,这个交互的入口,我们从Q1问题入手(博客按照这样的问题入手,是因为当时我也是从这里 ...
- 框架-springmvc源码分析(二)
框架-springmvc源码分析(二) 参考: http://www.cnblogs.com/leftthen/p/5207787.html http://www.cnblogs.com/leftth ...
- 十、Spring之BeanFactory源码分析(二)
Spring之BeanFactory源码分析(二) 前言 在前面我们简单的分析了BeanFactory的结构,ListableBeanFactory,HierarchicalBeanFactory,A ...
- Vue源码分析(二) : Vue实例挂载
Vue源码分析(二) : Vue实例挂载 author: @TiffanysBear 实例挂载主要是 $mount 方法的实现,在 src/platforms/web/entry-runtime-wi ...
- 多线程之美8一 AbstractQueuedSynchronizer源码分析<二>
目录 AQS的源码分析 该篇主要分析AQS的ConditionObject,是AQS的内部类,实现等待通知机制. 1.条件队列 条件队列与AQS中的同步队列有所不同,结构图如下: 两者区别: 1.链表 ...
- 二维码zxing源码分析(四)wifi部分
前三个部分的地址是:ZXING源码分析(一)CAMERA部分 . zxing源码分析(二)decode部分.zxing源码分析(三)result.history部分 前面三篇文章基本上已经把zxin ...
- Vue.js 源码分析(二十四) 高级应用 自定义指令详解
除了核心功能默认内置的指令 (v-model 和 v-show),Vue 也允许注册自定义指令. 官网介绍的比较抽象,显得很高大上,我个人对自定义指令的理解是:当自定义指令作用在一些DOM元素或组件上 ...
- ABP源码分析二十四:Notification
NotificationDefinition: 用于封装Notification Definnition 的信息.注意和Notification 的区别,如果把Notification看成是具体的消息 ...
随机推荐
- 解決 centos中-bash: vim: command not found
用centos 的主机的時候, 用 vim 时出现 -bash: vim: command not found. 只能使用 vi. 那么如何安裝 vim 呢? 输入 rpm -qa|grep vim ...
- gets函数完美替代
当我们在使用gets函数时候,因为不确定gets函数的buffer究竟有多大,所以这个函数只能用作是玩具函数.因此,当我们需要直接从输入得到一个东西的时候可以用fgets函数代替gets函数,这样不管 ...
- STL之queue(单向队列)
单向队列中的数据是先进先出(First In First Out,FIFO).单向队列一共6个常用函数(front().back().push().pop().empty().size()) #inc ...
- 基础算法-查找:线性索引查找(I)
前面介绍的几种查找的算法都是基于数据有序的基础上进行的.但是在实际的应用中,很多数据集可能有惊人的数据量,面对这些海量的数据,要保证记录全部按照当中的某个关键字有序,其时间代价是非常昂贵的,所以这种数 ...
- MySql 小问题集合
- 使用MySql通过SpringFramework来自动建表, 服务器用的是Tomcat, 在server.xml和context.xml中均正确配置了jdbc datasource. 编译通过, ...
- JavaScript 导学推荐
基本开始js学习的时候,可能会觉得很混乱,一开始都是从一些简单的表单验证还有拷贝别人效果代码,然后再慢慢去深入了解.我是觉得js是需要一定语言编程基础,我是觉得随着深入,JS的里面实在不算太好理解,个 ...
- Python 模块(八) socketserver 以及 线程、进程
目录 异常处理 socketserver 线程.进程 一.异常处理 try的工作原理是,当开始一个try语句后,python就在当前程序的上下文中作标记,这样当异常出现时就可以回到这里,try子句先执 ...
- css基本框架
- 在QuartusII 中使用tcl对工程进行复制——半自动
最近在看coyoo的博客,加上手上有一本coyoo老师的书籍.本人是脚本小白,怎么看都没有看懂这个自动化是怎么实现的. 先说我的半自动化,后面在说我对自动化的一点疑惑—— 目前没有实现 目录环境: 首 ...
- 转:shell比较两个字符串是否相等
比较两个字符串是否相等的办法是: if [ "$test"x = "test"x ]; then这里的关键有几点:1 使用单个等号2 注意到等号两边各有一个空格 ...