将这些信息读入内存之后,构造一个文件目录结构树,将表示文件或目录的节点填入到结构中。
然后是加载datanode信息(新版已取消该项)
再之后是加载FilesUnderConstruction.
BlocksMap:
block->datanode的信息没有持久化存储,而是namenode通过datanode的blockreport获取block->datanode list
BlocksMap负责维护了三种信息:
block->datanode list
block->INodeFile
datanode->blocks
这要归功于一个很牛逼的结构:Object[] triplets
他是一个三元组,每个block有几个副本,就有几个三元组。三元组的第一个元素表示该block所属的Datanode,类型是DatanodeDescriptor,通过它获得
block->datanode list
第二/三个元素表示该block所在Datanode上的前/后一个block(前驱和后继),类型是BlockInfo,通过它获得datanode->blocks
借助这个三元组可以找到一个block所属的所有datanode,也可以通过三元组的后两个元素信息找到一个datanode上所有的block。
上面这两个结构介绍之后,nn需要的namespace信息和block信息基本就全了。在nn加载fsimage完成之后,BlocksMap中只有每个block到其所属的datanodes list的对应关系信息还没建立。然后通过dn的blockReport来收集构建。当所有的dn汇报给nn的blockReport处理完毕后,BlocksMap整个结构也就构建完成了。
相关阅读:Hadoop HDFS源码namenode部分概述(二)