1.介绍
HDFS的文件系统目录树、文件/目录元数据信息以及文件对应的数据块等信息会持久化到磁盘上,保存在FSImage和Edit Log中。
其中,Fsimage文件是文件系统元数据的持久性检查点,即保存了某一时刻全量的NameNode的内存信息,该时刻往后的修改信息都会保存在Edit Log中,利用该机制确保了NameNode挂掉之后,内存数据不会丢失(因为全都保存到了磁盘上了)。另外,当NameNode重启后都需要载入FSImage进入内存,恢复到某一个检查点,再执行检查点后的编辑日志,进行重建。
2.FSImage和Edit Log的相关实现类
名字节点中的存储空间主要有FSImage类和FSEditLog类一起完成。其中FSImage类起主导作用,它管理着存储空间的生存期、负责FSImage文件的保存和加载、也会和第二名字节点合作,执行检查点过程。
(1)FSImage文件中的信息主要分为4类:文件头部、文件目录树信息、正在写入的文件信息以及安全相关的信息。
(a)文件头部和文件目录树是调用FSImage.saveFSImage(File newFile)方法,保存到参数newFile指定的文件中。文件头部信息主要包括FSImage文件的版本号、存储系统表示、目录树包含的文件数等;目录树信息主要在saveFSImage中会调用saveImage方法,在saveImage方法中会传入INodeDirectory类型的参数,该参数指明当前要保存的目录,会将当前要保存目录下的所有INode都会输出到输出流out中保存到磁盘上。
(b)正在写入的文件信息,即租约信息,是由FSImage类的writeINodeUnderConstruction()方法保存的,主要保存与正在写入的文件相关的信息,包括:用户名、修改时间、数据块数、文件权限等等。
(c)安全相关的信息主要由FSNamesystem。savaSecretManagerState()方法保存。
(2)Edit Log文件保存是通过FSEditLog.logEdit()方法保存的,该方法是一个synchronized的方法,确保了多线程环境下的日志内容不会相互影响。
(3)FSImage和Edit Log文件分别由FSImage.loadFSImage()和FSEditLog.loadFSEdits()来读取。首先调用FSImage.loadFSImage()将数据在内存中恢复到某一时刻,再调用FSEditLog.loadFSEdits()来对其进行修改,最终恢复为NameNode挂掉之前完整的内存信息。