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

  • 相关阅读:
    [转]开发者最容易犯的13个JavaScript错误
    http状态码表
    RDLC报表部署到服务器的相关问题
    sharepoint权限集中管理工具
    依赖注入
    HttpModule & HttpHandle
    回滚事务
    HTTPMOUDLE 和httphandler 学习
    JavaScript操作Table
    .ne工具库
  • 原文地址:https://www.cnblogs.com/mfrbuaa/p/5165482.html
Copyright © 2020-2023  润新知