`
zy19982004
  • 浏览: 654167 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
博客专栏
F6f66edc-1c1a-3859-b76b-a22e740b7aa7
Hadoop学习
浏览量:249804
社区版块
存档分类
最新评论

Hadoop学习二十二:Hadoop-Hdfs INode源码

 
阅读更多

一. INode类图

 

二. INode

  •       We keep an in-memory representation of the file/block hierarchy.This is a base INode class containing common fields for file and directory inodes.INode是文件层次结构的反应。
  • INode两个子类:INodeDirectory代表文件目录;INodeFile对应文件。INodeDirectoryWithQuota代表带容量限制的目录,限制了INodeDirectory的使用空间,包含namespace和磁盘空间;INodeFileUnderConstruction代表正在构建的文件,因为有些文件创建时间比较长,目录系统用INodeFileUnderConstruction维护这一信息。
  • INode
    abstract class INode implements Comparable<byte[]> {
      protected byte[] name;	//文件/目录名
      protected INodeDirectory parent;	//父目录
      protected long modificationTime;	//最后修改时间
      protected long accessTime;	//最后访问时间
      private long permission;	//permission是访问权限。HDFS采用了和UNIX/Linux类似的访问控制机制。
      							//系统维护了一个类似于UNIX系统的组表(group)和用户表(user),并给每一个组和用户一个ID
      							//permission在INode中是long型,它同时包含了组和用户信息。
    }
     

三. INodeDirectory

  •  INodeDirectory是HDFS管理的目录的抽象。
  • INodeDirectory维护着多个INode。其方法不外乎增删改查这些INode。
    private List<INode> children;

四.DatanodeID

  • DatanodeID代表一个DataNode,包含了DataNode的配置信息。
      public String name;       // hostname:port (data transfer port)
      public String storageID;  // unique per cluster storageID
      protected int infoPort;   // info server port
      public int ipcPort;       // ipc server port

 

五.DatanodeInfo

  • DatanodeInfo继承DatanodeID。
  • DatanodeInfo增加了一些动态信息。
      protected long capacity;
      protected long dfsUsed;
      protected long remaining;
      protected long lastUpdate;
      protected int xceiverCount;

六.DatanodeDescriptor

  • DatanodeDescriptor继承DatanodeInfo。
  • DatanodeDescriptor增加了DataNode上block的动态信息。
  • DatanodeDescriptor.BlockTargetPair:代表一个block和此block所处DataNodes的信息的对应关系。
        public final Block block;
        public final DatanodeDescriptor[] targets; 
  • DatanodeDescriptor.BlockQueue:维护者一系列BlockTargetPair。
    private final Queue<BlockTargetPair> blockq = new LinkedList<BlockTargetPair>();
  • DatanodeDescriptor维护者一个BlockInfo和两个BlockQueue和一个Set<Block>。
      private volatile BlockInfo blockList = null;
    
      /** A queue of blocks to be replicated by this datanode */
      //该DataNode上正在复制(replicateBlocks)的Block
      private BlockQueue replicateBlocks = new BlockQueue();
      /** A queue of blocks to be recovered by this datanode */
      //该DataNode上正在Lease恢复(recoverBlocks)的Block
      private BlockQueue recoverBlocks = new BlockQueue();
      /** A set of blocks to be invalidated by this datanode */
      //该DataNode上已经失效的Block
      private Set<Block> invalidateBlocks = new TreeSet<Block>();

 

七.BlockInfo

  •  BlockInfo继承Block。
  • BlockInfo保存了该Block归属的INodeFile和DatanodeDescriptor,同时还包括了它的前继和后继Block。
    private INodeFile  inode;
    private Object[] triplets;
  • 一个BlockInfo结构如下,tripltes[0]指向此BlockInfo所在的DatanodeDescriptor,tripltes[1]指前继BlockInfo,tripltes[2]指向后继BlockInfo。

八.BlocksMap

  •  BlocksMap保存了一系列Block到BlockInfo对应关系的。
     private GSet<Block, BlockInfo> blocks;
  • 结合上图可知,有了BlocksMap,就可以通过Block找对应的文件和这个Block所存放的DataNode的相关信息。

九.INodeFile

  • INodeFile是HDFS管理文件的抽象。
  • 一个INodeFile对应着多Block。如上图示。
    protected BlockInfo blocks[] 

 

十.分析一条线

  1.  http://zy19982004.iteye.com/blog/1890775文中三.8我们提到:定期调用namenode.blockReport()发送block report 告诉NameNode此DataNode上的block信息。接着分析:
  2. 看看远程RPC代理类NameNode的blockReport()方法,调用namesystem.processReport(DatanodeRegistration, blockList)。
      public DatanodeCommand blockReport(DatanodeRegistration nodeReg,
                                         long[] blocks) throws IOException {
        namesystem.processReport(nodeReg, blist);
         }
  3. FSNamesystem的processReport方法:找到是哪个DataNode发送过来的信息;执行此DataNode的reportDiff方法,找出和现在FSNamesystem维护着的block的差别;FSNamesystem修改差别。
    public synchronized void processReport(DatanodeID nodeID, 
                                             BlockListAsLongs newReport
                                            ) throws IOException {
        DatanodeDescriptor node = getDatanode(nodeID);
        //
        // Modify the (block-->datanode) map, according to the difference
        // between the old and new block report.
        //
        node.reportDiff(blocksMap, newReport, toAdd, toRemove, toInvalidate);
        ...
    }
  4. DatanodeDescriptor.reportDiff(...newReport...):分析差别。因为DatanodeDescriptor保存着此DataNode上所有Block的动态信息,把newReport(就是2里面的blockList)与之比较即可。

十一.说明

      本文有些地方并没有完全区分BlockInfo和Block,为了理解的方便,我会把BlockInfo当成Block;同样的我会把DatanodeDescriptor,DatanodeInfo当成DaNode。

 

 

分享到:
评论

相关推荐

    hadoop-hdfs:Hadoop分布式文件系统hdfs代码分析

    hadoop-hdfs Hadoop分布式文件系统hdfs代码分析目录介绍Datanode-数据块基本结构主要介绍了HDFS中第二关系块结构,数据块到数据中断的映射关系。退役-中断退款主要介绍了数据异步下线取消机制。INode-文件目录结构...

    hdfs源码.zip

    第1章 HDFS 1 1.1 HDFS概述 1 1.1.1 HDFS体系结构 1 1.1.2 HDFS基本概念 2 1.2 HDFS通信协议 4 1.2.1 Hadoop RPC接口 4 1.2.2 流式接口 20 1.3 HDFS主要流程 22 1.3.1 HDFS客户端读流程 22 1.3.2 ...

    高可用性的HDFS:Hadoop分布式文件系统深度实践

    6.2.2 Hadoop源码本地Build 6.2.3 NFS服务器构建 6.2.4 Avatar分发与部署 6.2.5 Primary(namenode0)节点配置 6.2.7 Data Node节点配置 6.2.8 Client节点配置 6.2.9 创建目录 6.2.10 挂载NFS 6.2.11 启动Ucarp 6.2....

    【Spark】六、org.apache.hadoop.security.AccessControlException

    Exception in thread main org.apache.hadoop.security.AccessControlException: Permission denied: user=L.MOON, access=WRITE, inode=/user/lsy/result1/_temporary/0:lsy:supergroup:drwxr-xr-x Caused by: org....

    hadoop分析

    维护HDFS文件系统中...寻路径流程:路径信息bocks[]triplets[]Client------------》INode---------------------》BlockInfo --------------------------》DataNode。INode:文件的基本元素:文件和目录BlockInfo:文

    git-test:git测试

    hadoop-hdfs Hadoop分布式文件系统hdfs代码分析目录介绍 Datanode-数据块基本结构主要介绍了HDFS中第二关系块结构,数据块到数据中断的映射关系。退役-中断退款主要介绍了数据异步下线取消机制。 INode-文件目录结构...

    一种针对高可用性Hadoop分布式文件系统(HDFS)架构的建议的机架感知模型-研究论文

    尽管通过资源管理基础架构的解耦来通过实现Hadoop框架进行了大量的努力,但是HDFS的元数据管理的集中式设计对Hadoop可伸缩性产生了不利影响,并导致了性能瓶颈。 一个名为NameNode的主节点(用于管理文件系统的整个...

    windows上传文件到虚拟机的hdfs上

    org.apache.hadoop.security.AccessControlException: Permission denied: user=ASUS, access=WRITE, inode 今天在windows连接虚拟机的hdfs,通过IDEA上传文件到虚拟机的hdfs上,出现了权限不足问题,原因是以...

Global site tag (gtag.js) - Google Analytics