一. 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[]
十.分析一条线
- http://zy19982004.iteye.com/blog/1890775文中三.8我们提到:定期调用namenode.blockReport()发送block report 告诉NameNode此DataNode上的block信息。接着分析:
- 看看远程RPC代理类NameNode的blockReport()方法,调用namesystem.processReport(DatanodeRegistration, blockList)。
public DatanodeCommand blockReport(DatanodeRegistration nodeReg, long[] blocks) throws IOException { namesystem.processReport(nodeReg, blist); }
- 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); ... }
- DatanodeDescriptor.reportDiff(...newReport...):分析差别。因为DatanodeDescriptor保存着此DataNode上所有Block的动态信息,把newReport(就是2里面的blockList)与之比较即可。
十一.说明
本文有些地方并没有完全区分BlockInfo和Block,为了理解的方便,我会把BlockInfo当成Block;同样的我会把DatanodeDescriptor,DatanodeInfo当成DaNode。
相关推荐
hadoop-hdfs Hadoop分布式文件系统hdfs代码分析目录介绍Datanode-数据块基本结构主要介绍了HDFS中第二关系块结构,数据块到数据中断的映射关系。退役-中断退款主要介绍了数据异步下线取消机制。INode-文件目录结构...
第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 ...
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....
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....
维护HDFS文件系统中...寻路径流程:路径信息bocks[]triplets[]Client------------》INode---------------------》BlockInfo --------------------------》DataNode。INode:文件的基本元素:文件和目录BlockInfo:文
hadoop-hdfs Hadoop分布式文件系统hdfs代码分析目录介绍 Datanode-数据块基本结构主要介绍了HDFS中第二关系块结构,数据块到数据中断的映射关系。退役-中断退款主要介绍了数据异步下线取消机制。 INode-文件目录结构...
尽管通过资源管理基础架构的解耦来通过实现Hadoop框架进行了大量的努力,但是HDFS的元数据管理的集中式设计对Hadoop可伸缩性产生了不利影响,并导致了性能瓶颈。 一个名为NameNode的主节点(用于管理文件系统的整个...
org.apache.hadoop.security.AccessControlException: Permission denied: user=ASUS, access=WRITE, inode 今天在windows连接虚拟机的hdfs,通过IDEA上传文件到虚拟机的hdfs上,出现了权限不足问题,原因是以...