解读Secondary NameNode的功能

来源:互联网 发布:ctr数据 编辑:程序博客网 时间:2024/06/05 03:20

概述

最近有朋友问我Secondary NameNode的作用是不是NameNode的备份?是不是为了防止NameNode的单点故障问题?确实,刚接触Hadoop,从字面上看,很容易会把Secondary NameNode当做备份节点;其实,这是一个误区,我们不能从字面来理解,阅读官方文档,我们可以知道,其实这并不是这么回事,下面就来赘述下Secondary NameNode的作用。


Secondary Name?

在Hadoop中,有一些命名模块不那么尽人意,Secondary NameNode就是一个典型的例子之一。从它的名字上看,它给人的感觉就像是NameNode的备份节点,但实际上却不是。很多Hadoop的入门者都很疑惑,Secondary NameNode究竟在其中起什么作用,它在HDFS中扮演的角色是什么。下面,我就来解释一下:

从名字来看,它确实与NameNode有点关系;因此,在深入了解Secondary NameNode之前,我们先来看看NameNode是做什么的。

1.NameNode

NameNode主要是用来保存HDFS的元数据信息,比如命名空间信息,块信息等等。当它运行的时候,这些信息是存在内存中的。但是这些信息也可以持久化到磁盘上。如下图所示:

namenode

上图展示了NameNode怎么把元数据保存到磁盘上,这里有两个不同的文件:

  • fsimage:它是NameNode启动时对整个文件系统的快照。
  • edits:它是在NameNode启动后,对文件系统的改动序列。
只有在NameNode重启时,edits才会合并到fsimage文件中,从而得到一个文件系统的最新快照。但是在生产环境集群中的NameNode是很少重启的,这意味着当NameNode运行了很长时间后,edit文件会变得很大。在这种情况下就会出现下面的问题:
  1. edits文件会变得很大,如何去管理这个文件?
  2. NameNode的重启会花费很长的时间,因为有很多改动要合并到fsimage文件上。
  3. 如果NameNode宕掉了,那我们就丢失了很多改动,因为此时的fsimage文件时间戳比较旧。
因此,为了克服这个问题,我们需要一个易于管理的机制来帮助我们减小edits文件的大小和得到一个最新的fsimage文件,这样也会减小在NameNode上的压力。而Secondary NameNode就是为了帮助解决上述问题提出的,它的职责是合并NameNode的edits到fsimage文件中。如图所示:
secondarynamenode
上图的工作原理,我这里也赘述一下:
  1. 首先,它定时到NameNode去获取edits,并更新到fsimage上。
  2. 一旦它有新的fsimage文件,它将其拷贝回NameNode上。
  3. NameNode在下次重启时会使用这个新的fsimage文件,从而减少重启的时间。
Secondary NameNode的整个目的在HDFS中提供一个Checkpoint Node,通过阅读官方文档可以清晰地知道,它只是NameNode的一个助手节点,这也是它在社区中被认为是Checkpoint Node的原因。
现在,我们明白Secondary NameNode所做的是在文件系统中设置一个Checkpoint来帮助NameNode更好的工作;它不是取代NameNode,也不是NameNode的备份。
Secondary NameNode的检查点进程启动,是由两个配置参数控制的:
  • fs.checkpoint.period:指定连续两次检查点的最大时间间隔,默认值是1小时。
  • fs.checkpoint.size:定义了edits日志文件的最大值,一旦超过这个值会导致强制执行检查点(即使没到检查点的最大时间间隔)。默认值是64MB。
如果NameNode上除了最新的检查点以外,所有的其他的历史镜像和edits文件都丢失了,NameNode可以引入这个最新的检查点。以下操作可以实现这个功能:
  • 在配置参数dfs.name.dir指定的位置建立一个空文件夹;
  • 把检查点目录的位置赋值给配置参数fs.checkpoint.dir;
  • 启动NameNode,并加上-importCheckpoint。
NameNode会从fs.checkpoint.dir目录读取检查点,并把它保存在dfs.name.dir目录下。如果dfs.name.dir目录下有合法的镜像文件,NameNode会启动失败。NameNode会检查fs.checkpoint.dir目录下镜像文件的一致性,但是不会去改动它。
注:关于NameNode是什么时候将改动写到edit logs中的?这个操作实际上是由DataNode的写操作触发的,当我们往DataNode写文件时,DataNode会跟NameNode通信,告诉NameNode什么文件的第几个block放在它那里,NameNode这个时候会将这些元数据信息写到edit logs文件中。

0 0
原创粉丝点击