10 分钟为你全面解答 HDFS 的 SecondaryNamenode 的作用
在 HDFS 相关的守护进程中,有 NameNode 进程、DataNode 进程、SecondaryNameNode 进程等。NameNode 和 DataNode 职责比较明确,我们都知道是做什么的,那么 SecondaryNameNode 的作用是什么呢?为什么 SecondayNameNode 要和 NameNode 部署在不同的节点上呢?有人说 SecondaryNameNode 是 NameNode 的备份,这种说法正确吗?我们来理解一下 SecondaryNameNode 是什么,主要是做什么工作的。
在正式的介绍 SecondaryNameNode 之前,我们先来认识两种文件: fsimage 和 eidts。我们都知道 NameNode 有一个作用就是维护 HDFS 分布式文件系统的目录树结构。在 HDFS 上有什么目录、每一个目录下又有什么文件等等,这些信息是需要维护的。
NameNode 在内存中维护文件系统的目录树结构,而这样的目录树结构随着 HDFS 的重启不会丢失,也就说明 NameNode 会将其序列化到本地磁盘上,以文件的形式保存下来。这个文件就是 fsimage 文件。我们可以在 NameNode 所在的节点发现这个文件。
那么,是不是我们每次对 HDFS 进行操作的时候,NameNode 都会将内存中记录的 HDFS 的目录树结构序列化下来呢?显然不应该是这样的,因为如果你的文件系统中的文件比较多、比较复杂,在内存中维护的数据量也会比较庞大,我们假设 1G。那么如果每当对目录树结构产生了修改之后,都需要将内存中的数据序列化到磁盘上的话,就产生大量的磁盘 IO。而且在序列化期间,如果 NameNode 宕机的话,会出现数据丢失的情况。
因此,NameNode 并不会实时的将每一次的变更都序列化到本地磁盘上。而是会周期性的进行序列化,一般来说一个小时序列化一次,生成 fsimage 文件。那么在这一个小时的时间之内,如果产生了新的文件结构变更怎么办?这个时候,NameNode 会将新的操作以 edit log 的形式保存在文件中,edit log 中并不会保存全部的目录结构,而只是记录了某一次的变更操作。
在 NameNode 启动的时候,首先加载本地磁盘上的 fsimage 文件,将一个完整的目录结构读取到内存中。然后再依次读取每一个 edit log 中的记录,在内存中进行推荐,对目录树结构进行推演。这样就可以得到上次关机的时候完整的目录树结构。
那么,SecondaryNameNode 是干什么的呢?上面提到了,NameNode 会周期性的对内存中的目录结构进行序列化,生成 fsimage 文件。其实这个工作是由 SecondaryNameNode 来完成的。SecondaryNameNode 会辅助 NameNode 进行 fsimage 和 edit log 的合并工作,减小 editlog 的大小,从而能够缩减下一次启动 NameNode 的时间。两个文件的合并周期,称之为检查点机制(checkpoint),是可以通过 hdfs-default.xml 配置文件进行修改的:
1. SecondaryNamenode 请求 Namenode 停止使用正在编辑的 editlog 文件,Namenode 会创建新的 editlog 文件,同时更新 seed_txid 文件。
2. SecondaryNamenode 通过 HTTP 协议获取 Namenode 上的 fsimage 和 editlog 文件。
3. SecondaryNamenode 将 fsimage 读进内存当中,并逐步分析 editlog 文件里的数据,进行合并操作,然后写入新文件 fsimage_x.ckpt 文件中。
4. SecondaryNamenode 将新文件 fsimage_x.ckpt 通过 HTTP 协议发送回 Namenode。
5. Namenode 再进行更名操作。
帮助到你的话就点个关注吧~
评论