下面来介绍一下hadoop中两个存储数据的组件NameNode和Secondary NameNode,分别简称为NN与2NN。
首先思考一个问题,数据存储在内存和磁盘上优缺点是什么?
优点:在内存上读写速度快,在磁盘上,关机不丢失
缺点:在内存上掉电丢失,可靠性差,在磁盘上,关机也不丢失数据,但是读写数据慢
有没有一种方法即能做到读写速度快又能关机不丢失数据呢?
hadoop的设计者聪明的想出来将存储数据分为两部分,一个是FsImage(元数据镜像文件),一个是Edits(追加操作日志)。
第一次启动NameNode格式化后,创建Fsimage和Edits文件。如果不是第一次启动,直接加载编辑日志和镜像文件到内存。用户进行操作,会先将操作描述写进edits磁盘文件中,然后将新写入的部分加载到内存中,如果是先进行将操作描述写入内存中,这时候掉电的话那么就会丢失数据。系统会根据这个操作也是直接加载到FsImage内存,到合并的时候才去根据这些操作写入fsimage磁盘中。
2NN作用:对FsImage和Edits进行合并。如果Edits文件量过大或者定时对两个文件开始合并操作,先将FsImage和Edits分别拷贝一份,在NN中生成一份新的Edits2文件也就是在合并过程中出现的用户操作写入Edits2文件中,2NN对拷贝的两份FsImage和Edits文件加载到内存中并合并生成新的Fsimage文件,这时候2NN会告诉NN,我合并好了,NN会将这份新的Fsimage文件替换旧的Fsiamge文件。
下面是详细说明:
1)第一阶段:NameNode启动
(1)第一次启动NameNode格式化后,创建Fsimage和Edits文件。如果不是第一次启动,直接加载编辑日志和镜像文件到内存。
(2)客户端对元数据进行增删改的请求。
(3)NameNode记录操作日志,更新滚动日志。
(4)NameNode在内存中对元数据进行增删改。
2)第二阶段:Secondary NameNode工作
(1)Secondary NameNode询问NameNode是否需要CheckPoint。直接带回NameNode是否检查结果。
(2)Secondary NameNode请求执行CheckPoint。
(3)NameNode滚动正在写的Edits日志。
(4)将滚动前的编辑日志和镜像文件拷贝到Secondary NameNode。
(5)Secondary NameNode加载编辑日志和镜像文件到内存,并合并。
(6)生成新的镜像文件fsimage.chkpoint。
(7)拷贝fsimage.chkpoint到NameNode。
(8)NameNode将fsimage.chkpoint重新命名成fsimage。