
NN和2NN工作机制 1.第一阶段:NameNode启动 (1)第一次启动NameNode格式化后,创建Fsimage和Edits文件。如果不是第一次启动,直接加载编辑日志和镜像文件到内存。 (2)客户端对元数据进行增删改的请求。 (3)NameNode记录操作日志,更新滚动日志。 (4)NameNode在内存中对数据进行增删改。 2.第二阶段:Secondary NameNode工作 (1)Secondary NameNode询问NameNode是否需要CheekPoint。直接带回NameNode检查结果。 (2)Secondary NameNode请求执行CheekPoint. (3)NameNode滚动正在写的Edits日志。 (4)将滚动前的编辑日志和镜像文件拷贝到Secondary NameNode。 (5)Secondary NameNode加载编辑日志和镜像文件到内存,病合并。 (6)生成新的镜像文件fsimage.chkpoint. (7)拷贝fsimage.chkpoint到NameNode. (8)NameNode将fsimage.chkpoint重新命名成fsimage。 NN和2NN工作机制详解 Fsimage:NameNode 内存中元数据序列化后形成的文件。 Edits:记录客户端更新元数据信息的每一步操作(可通过 Edits 运算出元数据)。 NameNode启动时,先滚动Edits并生成一个空edits.inprogress,然后加载Edits和Fsimage到内存中,此时 NameNode 内存就持有最新的元数据信息。Client 开始对 NameNode 发送元数据的增删改的请求,这些请求的操作首先会被记录到 edits.inprogress 中(查询元数据的操作不会被记录在 Edits 中,因为查询操作不会更改元数据信息),如果此时 NameNode挂掉,重启后会从 Edits 中读取元数据的信息。然后,NameNode 会在内存中执行元数据 的增删改的操作。由于 Edits 中记录的操作会越来越多,Edits 文件会越来越大,导致 NameNode 在启动加载Edits 时会很慢,所以需要对 Edits 和 Fsimage 进行合并(所谓合并,就是将 Edits 和 Fsimage加载到内存中,照着 Edits 中的操作一步步执行,最终形成新的 Fsimage)。 SecondaryNameNode 的作用就是帮助 NameNode 进行 Edits 和 Fsimage 的合并工作。SecondaryNameNode 首先会询问 NameNode 是否需要 CheckPoint(触发 CheckPoint 需要满足两个条件中的任意一个,定时时间到和 Edits 中数据写满了)。直接带回 NameNode是否检查结果。SecondaryNameNode 执行 CheckPoint 操作,首先会让 NameNode 滚动 Edits并生成一个空的 edits.inprogress,滚动 Edits 的目的是给 Edits 打个标记,以后所有新的操作都写入 edits.inprogress,其他未合并的 Edits 和 Fsimage 会拷贝到 SecondaryNameNode的本地,然后将拷贝的 Edits 和 Fsimage 加载到内存中进行合并,生成fsimage.chkpoint,然后将 fsimage.chkpoint 拷贝给 NameNode,重命名为 Fsimage 后替换掉原来的 Fsimage。NameNode 在启动时就只需要加载之前未合并的 Edits 和 Fsimage 即可,因为合并过的Edits 中的元数据信息已经被记录在 Fsimage 中。