Hadoop-组件-HDFS-源码学习-元数据管理-重建
一、概述
当 Namenode 启动时,首先会将 fsimage 文件中记录的命名空间加载到 Namenode 内存中,然后将 editlog 文件中记录的更新操作加载并合并到命名空间中。接下来 Namenode 会等待各个 Datanode 向自己汇报数据块信息来组装 blockMap,从而离开安全模式。Namenode 每次启动时都会调用 FSImage.loadFSImage() 方法执行加载 fsimage 和 editlog 文件的操作。
在 loadFSImage() 方法中加载 fsimage 文件是通过调用 FSImage.loadFSImageFile() 方法实现的,加载 editlog 文件则是通过调用 FSImage.loadEdits() 方法实现的。
二、加载 fsimage 文件
loadFSImageFile() 方法会根据当前 Namenode 的版本调用不同的加载方法,不同版本加载方法的区别主要是在 fsimage 文件的校验操作上,例如对于 2.6 版本的加载操作,每个 fsimage 文件都有一个对应的 md5 校验文件。fsimage 文件最终的加载工作是由私有的 loadFSImage()
方法实现的。
loadFSImage() 方法会构造一个 FSImageFormat.LoaderDelegator 对象加载 fsimage 文件,这个对象的 load() 方法会判断当前 fsimage 使用了什么序列化方式,如果在 fsimage 文件中有 MAGIC_HEADER,则该 fsimage 文件使用的是 protobuf 序列化方式,那么构造
FSImageFormatProtobuf.Loader 执行加载操作,否则使用 FSImageFormat.Loader 类执行加载操作。
三、加载 editlog 文件
Namenode 将 fsimage 中记录的特定时刻的命名空间镜像加载到内存之后,还需要加载后续对命名空间的修改,也就是 editlog 中记录的修改命名空间的操作。Namenode 会调用 FSImage.loadEdits() 方法将 editlog 文件中记录的更新操作与当前 Namenode 的命名空间进行合并。FSImage.loadEdits() 方法会构造一个 FSEditLogLoader 对象,然后遍历 Namenode 所有存储路径上保存的 editlog 文件的输入流,并调用 FSEditLogLoader.loadFSEdits() 方法加载指定路径上的 editlog 文件。