一、NameNode数据结构
1、物理结构
${dfs.name.dir}/current/{VERSION,edits,fsimage,fstime}
dfs.name.dir是一个目录列表,存储每个目录的镜像。VERSION文件是Java属性文件,包含运行HDFS的版本信息。
edits,是编辑日志文件。当客户断执行写操作的时,NameNode首先会在编辑日志中写下记录,并在内存中保存一个文件系统元数据,这个描述符会在编辑日志有了改动后更新。内存中的元数据用来提供读数据请求服务。
编辑日志会在每次成功操作之后,且成功代码尚未返回给客户端之前进行刷新和同步。对于要写入多个目录的操作,该写入流要刷新和同步到所有的副本上,这就保证了操作不会因故障丢失数据。
fsimage 是一个二进制文件,当中记录了HDFS中所有文件和目录的元数据信息,以及文件中块的相关信息
2、逻辑结构
a、NameNode加载FsImage到内存后,形成一个目录树的结构(FSDirectory,INode,INodeFile<BlockInfo[]>)
b、Datanode通过心跳,上报block信息,在NameNode中形成BlocksMap(Block-->DataNode的对应关系)
c、NameNode分配块到DataNode,在写文件块的过程中,出现错误,那么会由client或DataNode上报给NameNode,表示该块失效。NameNode保存在CorruptReplicationMap中
d、在DataNode处于退役阶段、离开安全模式等阶段时,需要检查该DataNode的blocks的数量是否达到复制因子的要求,没有则加入需要复制的请求队列UnderReplicatedBlocks<