(1)NameNode保存的两种信息:文件与block的映射、block与DataNode的映射。文件和block的映射,固化在磁盘上。而block和DataNode的映射在DataNode启动时上报给NameNode
(2)DatanodeProtocol:用于DataNode来调用NameNode上的方法,情景是DataNode向NameNode通信,方法参数传递到NameNode上;
ClientProtocol:提供给客户端,用于访问NameNode。它包含了文件角度上的HDFS功能。和GFS一样,HDFS不提供POSIX形式的接口,而是使用了一个私有接口。一般来说,程序员通过org.apache.hadoop.fs.FileSystem来和HDFS打交道,不需要直接使用该接口;
NamenodeProtocol:用于从NameNode到NameNode的通信;
InterDatanodeProtocol:用于DataNode和DataNode通信,只有一个updateBlock(Block oldblock, Block newblock, boolean finalize)方法;
ClientDatanodeProtocol:用于Client和DataNode之间通信,只有recoverBlock(Block block, boolean keepLength,
DatanodeInfo[] targets)方法,但是Client和DataNode之间应该不只这些,需要到后面看到读写的情况在仔细分析;
(3)INode是一个抽象类,它的两个字类,分别对应着目录(INodeDirectory)和文件(INodeFile)。INodeDirectoryWithQuota,如它的名字隐含的,是带了容量限制的目录。INodeFileUnderConstruction,抽象了正在构造的文件,当我们需要在HDFS中创建文件的时候,由于创建过程比较长,目录系统会维护对应的信息。
INode中的成员变量有:name,目录/文件名;modificationTime和accessTime是最后的修改时间和访问时间;parent指向了父目录;permission是访问权限。HDFS采用了和UNIX/Linux类似的访问控制机制。系统维护了一个类似于UNIX系统的组表(group)和用户表(user),并给每一个组和用户一个ID,permission在INode中是long型,它同时包含了组和用户信息。
INode中的抽象方法:collectSubtreeBlocksAndClear,用来收集INode所有孩子的block,因为INode可能是文件或者目录,目录的话就不含有Block,而文件则有多个Block,返回值为文件的个数而非Block的个数;computeContentSummary用于递归计算INode包含的一些相关信息,如文件数,目录数,占用磁盘空间。
(4)INodeDirectory是INode的子类,里面有List<INode> children,因为目录下既有目录也有文件。
(5)INodeDirectoryWithQuota进一步加强了INodeDirectory,限制了INodeDirectory可以使用的空间。
(6)INodeFile是HDFS中的文件,BlockInfo blocks[]对应这个文件的列表,BlockInfo增强了Block类。
(7)INodeFileUnderConstruction保存了正在构造的文件的一些信息,包括clientName,这是目前拥有租约的节点名(创建文件时,只有一个节点拥有租约,其他节点配合这个节点工作)。clientMachine是构造该文件的客户端名称,如果构造请求由DataNode发起,clientNode会保持相应的信息,targets保存了配合构造文件的所有节点。租约就是一次操作的许可证,只在一个节点中持有。
(8)BlocksMap:Whose essential functions round aroud Map<Block, BlockInfo>.This class maintains the map from a block to its metadata. block's metadata currently includes INode it belongs(INodeFile) to and the datanodes that store the block(DatanodeDescriptor). BlockInfo contains INodeFile and DatanodeDescriptor which enhances Block.
(9)NameNode需要知道DataNode的信息,最基本的是DatanodeID(hostname:portNumber,unique per cluster storageID(貌似没有什么用),infoserver的端口,ipcserver的端口)
(10)再加一些信息变成DatanodeInfo增加了一些动态信息(容量等),再加上一些Block的动态信息变成DatanodeDescriptor,DatanodeDescriptor包含了两个BlockQueue,分别记录了该DataNode上准备复制(replicateBlocks)和Lease恢复(recoverBlocks这个操作有些不明白)的BlockTargetPair(Block和多个目的DataNode的结构)。同时还有一个Block集合,保存的是该DataNode上已经失效的Block。DatanodeDescriptor提供一系列方法,用于操作上面保存的队列和集合。也提供get*Command方法,用于生成发送到DataNode的命令。当NameNode收到DataNode对现在管理的Block状态的汇报是,会调用reportDiff,找出和现在NameNode上的信息差别,以供后续处理用。