关于NameNode上存储BLock块的相关信息深入理解
介绍一个专用名称:blockReport,DataNode启动后向NameNode注册,通过后,周期性(1小时)的向NameNode上报所有的块信息的过程叫做blockReport
在NameNode启动加载fsimage中加载时候,是没有bLock的一个映射信息的(即我们不知道该block具体存储在哪几个节点上),而在所有datanode启动时,每个datanode对磁盘进行扫描,将自身的块信息汇报给NameNode(blockReport),此时NameNode接收到每个datanode的块信,将此信息保持到内存中,HDFS就是通过这种块信息汇报的方式来完成 block -> datanodes list的对应表构建,由namenode进行保存此映射,保存为BlocksMap,下图为BlocksMap的内部数据结构
上图解析:BlocksMap实际上就是一个Block对象对BlockInfo对象的一个Map表,其中Block对象中只记录了blockid,block大小以及时间戳信息,这些信息在fsimage中都有记录。而BlockInfo是从Block对象继承而来,因此除了Block对象中保存的信息外,还包括代表该block所属的HDFS文件的INodeFile对象引用以及该block所属datanodes列表的信息(就是我们所认知的block具体存储在哪几个节点上)
综上所述:fsimage加载完毕后,BlocksMap中仅缺少每个块对应到其所属的datanodes list的对应关系信息。所缺这些信息,就是通过上文提到的从各datanode接收blockReport来构建。当所有的datanode汇报给namenode的blockReport处理完毕后,BlocksMap整个结构也就构建完成
因此可以说Namenode保存数据块的映射,但是不会保存块在哪个datanode上。