以下轮到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的更多相关文章

  1. Hadoop源码分析之数据节点的握手,注册,上报数据块和心跳

    转自:http://www.it165.net/admin/html/201402/2382.html 在上一篇文章Hadoop源码分析之DataNode的启动与停止中分析了DataNode节点的启动 ...

  2. Tomcat源码分析二:先看看Tomcat的整体架构

    Tomcat源码分析二:先看看Tomcat的整体架构 Tomcat架构图 我们先来看一张比较经典的Tomcat架构图: 从这张图中,我们可以看出Tomcat中含有Server.Service.Conn ...

  3. Fresco 源码分析(二) Fresco客户端与服务端交互(1) 解决遗留的Q1问题

    4.2 Fresco客户端与服务端的交互(一) 解决Q1问题 从这篇博客开始,我们开始讨论客户端与服务端是如何交互的,这个交互的入口,我们从Q1问题入手(博客按照这样的问题入手,是因为当时我也是从这里 ...

  4. 框架-springmvc源码分析(二)

    框架-springmvc源码分析(二) 参考: http://www.cnblogs.com/leftthen/p/5207787.html http://www.cnblogs.com/leftth ...

  5. 十、Spring之BeanFactory源码分析(二)

    Spring之BeanFactory源码分析(二) 前言 在前面我们简单的分析了BeanFactory的结构,ListableBeanFactory,HierarchicalBeanFactory,A ...

  6. Vue源码分析(二) : Vue实例挂载

    Vue源码分析(二) : Vue实例挂载 author: @TiffanysBear 实例挂载主要是 $mount 方法的实现,在 src/platforms/web/entry-runtime-wi ...

  7. 多线程之美8一 AbstractQueuedSynchronizer源码分析<二>

    目录 AQS的源码分析 该篇主要分析AQS的ConditionObject,是AQS的内部类,实现等待通知机制. 1.条件队列 条件队列与AQS中的同步队列有所不同,结构图如下: 两者区别: 1.链表 ...

  8. 二维码zxing源码分析(四)wifi部分

    前三个部分的地址是:ZXING源码分析(一)CAMERA部分  . zxing源码分析(二)decode部分.zxing源码分析(三)result.history部分 前面三篇文章基本上已经把zxin ...

  9. Vue.js 源码分析(二十四) 高级应用 自定义指令详解

    除了核心功能默认内置的指令 (v-model 和 v-show),Vue 也允许注册自定义指令. 官网介绍的比较抽象,显得很高大上,我个人对自定义指令的理解是:当自定义指令作用在一些DOM元素或组件上 ...

  10. ABP源码分析二十四:Notification

    NotificationDefinition: 用于封装Notification Definnition 的信息.注意和Notification 的区别,如果把Notification看成是具体的消息 ...

随机推荐

  1. JAVA虚拟机内存模型

    一.对于Java程序员来说,在虚拟机的自动内存管理机制下,我们不需要为每一个new操作去写匹配的delete/free操作 但是当我们对于内存的管理了解有能够帮助我们理解Java虚拟机的垃圾回收机制. ...

  2. mac下面xcode+ndk7配置cocos2dx & box2d的跨ios和android平台的游戏教程

    这篇教程是介绍如何使用cocos2d-x和box2d来制作一个demo,且此demo能同时运行于ios和android平台.在继续阅读之前,建议您先阅读上一篇教程. 首先,按照上一篇教程,搭建好mac ...

  3. js日历,使用datepicker.js,ui.core.js,jquery-1.7.1.js

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  4. Linux(CentOS或RadHat)下MySQL源码安装

    安装环境: CentOS6.3 64位 软件: Mysql-5.6 所需包: gcc/g++ :MySQL 5.6开始,需要使用g++进行编译.cmake  :MySQL 5.5开始,使用cmake进 ...

  5. (Problem 57)Square root convergents

    It is possible to show that the square root of two can be expressed as an infinite continued fractio ...

  6. 转:JavaScript定时机制、以及浏览器渲染机制 浅谈

    昨晚,朋友拿了一道题问我: a.onclick = function(){ setTimeout(function() { //do something ... },0); }; //~~~ 我只知道 ...

  7. hibernate 数据关联一对一 3.2

    第一种一对一 person和card,card的id即作为主键,又作为外键  // 各村对方的一个对象 public class Person { private Integer id; privat ...

  8. Maven 版 JPA 最佳实践

    项目结构图 数据库环境 数据库:MySQL 版本:5.x 数据库名:jpa-demo 用户名密码:root/1234 代码清单 1:数据库脚本: /* Navicat MySQL Data Trans ...

  9. c++ 复制构造函数和赋值函数

    c++ 自动提供了下面这些成员函数 1默认构造函数 2.复制构造函数 3.赋值操作符 4.默认析构函数 5.地址操作符 赋值构造函数copy construtor 用于将一个对象复制到新创建的对象中, ...

  10. java.lang.Math类,方法学习笔记

    /**java.lang 包中的Math 类提供有常量 * 并包含有用于执行基本数学运算的 * 方法,如初等指数.对数.平方根 * 用于进行更高级的数学运算.由于 * 在Math 类的方法都是静态的, ...