问题引入
DataNode的元数据是储存在那里的?
首先我们假设数据是存放在磁盘中的,但是hadoop肯定是要频繁进行随机的访问,和处理客户端发过来的请求等等,如果存放在磁盘读取存放效率肯定极低,所以肯定不可能只存放在磁盘中的,这个时候我们想元数据储存在内存中,这样效率肯定就高了啊,没错如果储存在内存里,那么进行数据访问时肯定会比较快,但是如果这个时候不小心发生了断电,那么内存中的数据不就丢失了吗?整个数据肯定没办法正常工作了,所以产生在磁盘中备份元数据的FsImage。
但是如果是这样,内存更新元数据的同时还需要同步磁盘,这样其实效率依然不高,但如果发生意外那么数据会面临出错的风险,因此,引入Edits文件(只进行追加操作,效率很高)。每当元数据有更新或者添加元数据时,修改内存中的元数据并追加到Edits中。这样即使断电也就让edits文件和fslmage文件同步组合成元数据,这样就可以解决这个问题。
但是问题依旧严重因为如果我们一直向edits中写入数据,那么edits文件就会变得极其臃肿,如果一但断电,结合成元数据的时间会变得极其绵长,随着使用的增加越开越慢,这样肯定是不行的,那么我们就想到,我们把这份时间切开,比如如果数据达到1g,或者时间过去一个小时,我就执行一次更新,这样不就好了吗,没错这样就可以解决这个问题,但是我们把这个工作交给namenode去做的话,那么namenode的效率就会下降,为了解决这个问题SecondaryNameNode诞生了,专门用来处理合并fslmage和edits文件。
工作机制
(尚硅谷我的神)
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。
在每次NameNode启动之后都会同步一次,保证在集群启动时所有数据都是最新,且同步的。
所以其实NN和SNN的关系就是老板与秘书的关系,SNN辅助NN工作缓解NN的压力,也更好的保证了数据的完整性和快速性。
接下来介绍一下DataNode的工作机制
(1)一个数据块在DataNode上以文件形式存储在磁盘上,包括两个文件,一个是数据本身,一个是元数据包括数据块的长度,块数据的校验和,以及时间戳。
(2)DataNode启动后向NameNode注册,通过后,周期性(6小时)的向NameNode上报所有的块信息。
(3)心跳是每3秒一次,心跳返回结果带有NameNode给该DataNode的命令如复制块数据到另一台机器,或删除某个数据块。如果超过10分钟没有收到某个DataNode的心跳,则认为该节点不可用。
(4)集群运行中可以安全加入和退出一些机器。
DataNode就是一个勤勤恳恳的打工仔,负责储存汇报。
其中因为datanode是存储数据的节点,大数据一旦数据发生错误对公司来说是非常严重的事故,所以在datanode内部有一套自己保证数据完整性的方法
(1)当DataNode读取Block的时候,它会计算CheckSum。
(2)如果计算后的CheckSum,与Block创建时值不一样,说明Block已经损坏。
(3)Client读取其他DataNode上的Block。
(4)常见的校验算法crc(32),md5(128),sha1(160)
(5)DataNode在其文件创建后周期验证CheckSum。
以上内容参考尚硅谷
如有侵权联系删