NN和2NN的内部工作原理
对于NameNode的存放位置:
内存中:好处:计算快
坏处:可靠性差,断电后元数据会丢失
磁盘中:好处:可靠性搞
坏处:计算慢
内存+磁盘中:效率低
所以设置在磁盘中的备份元数据的镜像文件FsImage(只存储数据),但元数据更新时需要同时更新FsImage,否则会产生数据一致性的问题,且断电后元数据会丢失。
引入Edits日志文件(只进行追加操作)。每当元数据有更新或者添加元数据时,修改内存中的元数据并追加到Edits中。一旦NameNode节点断电,通过FsImage和Edits的合并元数据。
引入一个新的节点SecondaryNamenode,专门用于定期合并FsImage和Edits。
综上,NameNode存放于内存中,FsImage和Edits存放与磁盘中,SecondaryNamenode定期合并FsImage和Edits,当开机时加载FsImage和Edits到NameNode。
1.第一阶段:NameNode启动
(1)第一次启动NameNode格式化后,创建Fsimage镜像文件和Edits日志文件。如果不是第一次启动,直接加载编辑日志和镜像文件到内存。
(2)客户端对元数据进行增删改的请求。
(3)NameNode记录操作日志,更新滚动日志。(先记录日志再更改内存,如果先更改内存再记录,在更改内存后遇到断电,则不会记录此次更改的记录,导致内存丢失)
(4)NameNode在内存中对元数据进行增删改。
2.第二阶段:Secondary NameNode工作
(1)Secondary NameNode询问NameNode是否需要CheckPoint(触发条件,定时器到期;Edits日志文件数据满)。直接带回NameNode是否检查结果。
(2)Secondary NameNode请求执行CheckPoint。
(3)NameNode滚动正在写入Edits日志。
(4)将滚动前的编辑日志和镜像文件拷贝到Secondary NameNode。
(5)Secondary NameNode加载编辑日志和镜像文件到内存,并合并。
(6)加载后Secondary NameNode生成新的镜像文件fsimage.chkpoint。
(7)Secondary NameNode拷贝fsimage.chkpoint到NameNode。
(8)NameNode将fsimage.chkpoint重新命名成fsimage。
DataNode工作机制
(1)DataNode主动向NameNode汇报自己的块信息。
(2)NameNode则记录下 有哪些块是正常的,并向DataNode发送注册成功。
(3)DataNode每隔一个周期(6h)向NameNode汇报所有块的信息,保证数据的可靠性。
(4)DataNode和NameNode有周期性(3s)的互通信息,确保DataNode还是活动状态。
(5)若一定的时间NameNode没有收到DataNode信息,则任务该节点不可用(即NameNode不允许客户端向DataNode读写数据)。
数据的完整性
Hadoop使用crc校验位进行数据一致性校验,先对原始数据进行crc计算,然后与传输过来的crc校验位比较是否一致。