回顾

前面的文章写道NameNode初始化中的initialize方法里面的startHttpServer,这篇文章将会带你们了解loadNamesystem方法。

先回顾下总体的代码结构,心中先有个大致的了解


loadNamesystem

1.这篇文章将主要分析元数据的加载,在NameNode启动的时候,会将磁盘上的fsimage和edits两个文件都读取到内存中进行合并,形成一份最新的元数据。然后会通过调用FSNamesystem.loadFromDisk()构造FSImage对象,同时构造FSEditLog对象


2.NameNode将文件系统的管理委托给了FSNamesystem对象,NameNode会调用FSNamesystem.loadFromDisk()创建FSNamesystem对象,然后将fsimage文件和editlog文件加载到命名空间中加载镜像、重做编辑日志,并打开一个新编辑文件都在此方法中。


3.在NameNode刚启动的时候,会从磁盘读取fsimage和edits文件到内存中,合并为一份最新的元数据,然后将这份新的元数据写出到磁盘替换之前旧的fsimage。然后,还会重新打开一个空的edits文件,以供接下来的元数据变动日志写入。


4.接下来看看FSNamesystem的loadFSImage方法


5.然后调用FSImage的recoverTransitionRead方法。FSImage负责处理检查点和记录命名空间编辑。这个方法先对保存命名空间镜像和保存编辑日志的目录进行分析,如果目录处于非正常状态,先对其进行恢复,然后查看节点状态,如果没有格式化则系统帮助我们格式化(先删除 后 创建)然后再调用FSImage.loadFSImage()方法将镜像和编辑日志数据导入到内存中


6.最终,调用的FSImage.loadFSImage,从一个目录中选择最新的镜像 加载它并和编辑日志进行合并


小结

前面从代码分析了元数据的一个加载,最终是通过FSImage的loadFSImage方法完成,下面是元数据大概的一个流程,这篇文章就分析到这,如果要进一步分析就得进入loadFSImage方法里面去了。


推荐

如果你对Hadoop的源码感兴趣的话,而自己又没有头绪的话,那么推荐你购买下面这本书,我最近也在看这本书,这本书深入剖析了HDFS 2.X中各个模块的实现细节,包括RPC框架实现、Namenode实现、Datanode实现以及HDFS客户端实现等,对阅读Hadoop有很大的一个帮助。