HDFS架构——NameNode

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/baidu_28312631/article/details/48089455

    在学习NameNode之前,我们先回顾一下 HDFS 的整个系统构架。

    

    在上一篇文章中我们讲过了 NameNode 是管理节点,里面存放元数据,那么我们先来看看元数据的存储细节。

元数据存储细节

    HDFS 为了保证数据的快速读写,并且要保证数据的安全,它就将元数据保存在内存一份,还保存在磁盘一份,来看看元数据在内存中是如何存储的。

    

    我们举个例子来说明元数据里面都有哪些东西,如上图所示,/test/a.log 代表的是元数据里面保存的是该文件的信息3 代表该文件存了3个副本{blk_1,blk_2} 表示该文件被切分成了2块,分别是块 blk_1 和块 blk_2; [{blk_1:[h0,h1,h3]},{blk_2:[h0,h2,h4]}] 表示块 blk_1 的三个副本分别存放在 h0,h1,h3这三台机器上,blk_2 的三个副本分别存放在 h0,h2,h4这三台机器上

    综上,可以对元数据进行一个总结:元素据存放的是数据(文件)的描述信息

NameNode

    NameNode是整个文件系统的管理节点。它维护着整个文件系统的文件目录树,文件/目录的的元信息和每个文件对应的数据块列表。接收用户的操作请求。

    文件包括:

      1.fsimage:元数据镜像文件。之前我们已经说过元数据要在内存保存一份,还要在磁盘保存一份。这里的fsimage就相是磁盘保存的那一份,存储某一时段 NameNode 内存元数据信息。 

      2.edits:操作日志文件。比如你上传或者删除了一个文件,edits 里就会记录这些操作信息。

      3.fstime:保存最近一次 checkpoint 的时间。

    以上这些文件是保存在linux的文件系统中。

NameNode 的工作特点

    NameNode 始终在内存中保存 metedata,用于处理“读请求”。

    到有“写请求”到来时,namenode 会首先写 editlog 到磁盘,即向 edits 文件中写日志,成功返回后,才会修改内存,并向客户端返回。

    Hadoop 会维护一个 fsimage 文件,也就是 namenode 中 metedata 的镜像,但是 fsimage 不会随时与 namenode 内存中的 metedata 保持一致,而是每隔一段时间通过合并 edits 文件来更新内容。Secondary Namenode 就是用来合并 fsimage 和 edits 文件来更新 NameNode 的 metedata 的

Secondary NameNode

    HA(高可靠性)的一个解决方案。但不支持热备。配置即可。

    执行过程:从 NameNode 上下载元数据信息(fsimage,edits),然后把二者合并,生成新的 fsimage,在本地保存,并将其推送到 NameNode,替换旧的 fsimage。

Secondary NameNode 的工作流程

    1.secondary 通知 namenode 切换 edits 文件

    2.secondary 从 namenode 获得 fsimage 和 edits(通过http)

    3.secondary 将 fsimage 载入内存,然后开始合并 edits

    4.secondary 将新的 fsimage 发回给 namenode

    5.namenode 用新的 fsimage 替换旧的 fsimage

什么时候 checkpoint

    fs.checkpoint.period 指定两次 checkpoint 的最大时间间隔,默认3600秒。

    fs.checkpoint.size 规定 edits 文件的最大值,一旦超过这个值则强制 checkpoint,不管是否到达最大时间间隔。默认大小是64M。

数据同步过程

    

    我来举个例子说明这个过程:假设你在一个月前向HDFS里面上传了两个文件,而在此之前,HDFS里面一个文件都没有,接下来这一个月你没有对HDFS做任何操作,Secondary NameNode 在这个月内进行了很多次同步,这个时候内存中的 metedata 保存了2条文件的描述信息,fsimage 里面也有两条信息,因为在其间发生了很多次合并,fsimage 和内存中的数据已经同步了,而 edits 里面0条信息,因为只要 fsimage 跟 edits 进行合并,合并以后原 edits 便会清空并删除。而 edits 在每合并一次的时候都会生成一个新的 edits,因为此时原 edits正在被操作,如果这时候有数据传过来就肯定不能保存在原来的 edits 里,因此需要有一个新的 edits来保存新的数据。现在当我们再向HDFS里上传一个文件,edits 里面就多了一条描述信息,成功后返回,接着修改内存,内存中的信息也加1,现在内存中一共3条描述信息,edits 里面有1条描述信息,fsimage 里面有2条信息。此时内存和 fsimage 里面的数据就不同步了,然后 Secondary NameNode 就要工作了,获取 edits 和 fsimage 文件,进行合并,合并之后总共有了3条信息,现在就跟 内存中的 metedata 同步了。合并的时机就是上面介绍的 checkpoint 的时间

    然后我们看看完整的流程图,根据我举的例子来完全理解这个图:

    

猜你喜欢

转载自blog.csdn.net/baidu_28312631/article/details/48089455