Hadoop-组件-HDFS-源码学习-元数据管理-保存
一、概述
FSImage 类最重要的功能之一就是将当前时刻 Namenode 的命名空间保存到 fsimage 文件中。
二、实现
FSNameSystem 会调用 FSImage.saveNamespace() 方法触发命名空间的保存操作。
2.1. saveFSImagelnAllDirs()
Namenode 可以定义多个存储路径来保存 fsimage 文件,对于每一个存储路径,saveFSImagelnAllDirs() 方法都会启动一个线程负责在这个路径上保存 fsimage 文件。同时,为了防止保存过程中出现错误,命名空间信息首先会被保存在一个 fsimage.ckpt 文件中,当保存操作全部完成之后,才会将 fsimage.ckpt 重命名为 fsimage 文件。之后 saveFSImagelnAllDirs()方法会清理 Namenode 元数据存储文件夹中过期的 editlog 文件和 fsimage 文件。
命名空间具体的保存操作是由 FSImageSaver 类负责,FSImageSaver 是 FSImage 中的内部类,也是一个线程类,它的 run() 方法调
用了 saveFSImage() 方法来保存 fsimage 文件。
saveFSImage() 方法会使用一个 FSImageFormat.Saver 对象来完成保存操作,FSImageFormat.Saver 类会以 fsimage 文件定义的格式保存 Namenode 的命名空间信息,命名空间信息会先写入 fsimage.ckpt 文件中。
saveFSImage() 方法还会生成 fsimage 文件的 md5 校验文件,以确保 fsimage 文件的正确性。
saveFSImage() 方法构造 FSImageFormatProtobuf.Saver 对象来保存命名空间,FSImageFormatProtobuf 是一个工具类,它提供了以 protobuf 格式读取和写入 fsimage 文件的方法。
在 HDFS2.4 版本的实现中,FSImage 使用 FSImageFormat 类作为读取和写入 fsimage 文件的标准格式类,而 HDFS2.6 版本则使用了 FSImageFormatProtobuf 替代了 FSImageFormat 类。
FSImageFormatProtobuf 除了有 Saver 内部类用于保存命名空间到 fsimage 文件外,还提供了一个 Loader 内部类用于解析和加载 fsimage 文件。