现在的位置: 首页 > 综合 > 正文

BlocksMap源码分析

2014年09月02日 ⁄ 综合 ⁄ 共 904字 ⁄ 字号 评论关闭

        BlocksMap,主要功能是保存block和其元数据的映射,block的元数据为它所在的INode和存储该block的DataNode。Block对象记录了blockid、block大小以及时间戳信息。block->DataNode的信息没有持久化存储,而是NameNode通过DataNode的blockReport获取该block所在的DataNode List。block的元数据对应的类为BlocksMap.BlockInfo。下面我们将对BlockInfo进行详细分析。

        BlockInfo继承了Block, 它包括private INodeFile inode 和 Object[] triplets 等成员变量。INodeFile inode表示该block对应的INode节点;triplets为三元组,block有几个副本,就有几个三元组, this.triplets = new Object[3*replication]。三元组的第一个元素表示该block所属的DataNode,类型是DatanodeDescriptor,通过它可以获得block->DataNode
list,
对应的函数为DatanodeDescriptor getDatanode(int index)。DataNodeDescriptor有一个重要的内部类BlockTargetPair,该类主要保存一个block和其对应的一组DatanodeDescriptor。第二、三个元素表示该block所在DataNode上的前/后一个block(前驱和后继),类型是BlockInfo,对应的函数为BlockInfo getPrevious(int
index), BlockInfo getNext(int index)。通过它可以获得DataNode->blocks。借助这个三元组可以找到该block所属的所有DataNode,也可以通过三元组的后两个元素信息找到该block所在DataNode上所有的block。

     
下图为BlcokInfo的结构。假设该文件有2个副本。

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

抱歉!评论已关闭.