namenode维护元数据

一、NameNode启动时如何维护元数据:
1、概念介绍:
Edits文件:
编辑日志的作用
编辑日志是记录对文件或者目录的修改信息,比如删除目录,修改文件等信息。编辑日志一般命名规则是“edits_*”,它在NameNode启动后,记录对文件系统的改动序列。
edits文件存放的是hadoop文件系统的所有更新操作的路径,文件系统客户端执行的所有写操作首先会被记录到edits文件中。
FsImage映像文件:
镜像文件的作用
通过查看上面的xml文件,可以知道镜像文件实际是存放的目录结构、文件属性等相关信息。另外也可以看到MD5校验文件,这个文件主要是用来判断镜像文件是否发生修改。fsimage文件是NameNode中关于元数据的镜像,一般称为检查点,它是在NameNode启动时对整个文件系统的快照。
fsimage文件是hadoop文件系统元数据的一个永久性的检查点,其中包含hadoop文件系统中的所有目录和文件idnode的序列化信息。

-rw-rw-r--  1 czz   czz   42 2月   3 10:41 edits_*
-rw-rw-r--  1 czz   czz   1.0M 2月   3 10:41 edits_inprogress_0000000000000021485
-rw-rw-r--  1 czz   czz   21K 2月   3 10:41 fsimage_0000000000000021484
-rw-rw-r--  1 czz   czz   62 2月   3 10:41 fsimage_0000000000000021484.md5
-rw-rw-r--  1 czz   czz   6 2月   3 10:41 seen_txid
-rw-rw-r--. 1 czz   czz   202 2月   2 13:34 VERSION

每个以MD5命名结尾的文件是对其前缀的校验,也就是说在看到的两个文件(fsimage_*)中,实际存储数据的是非MD5结尾的文件。
总结:
fsimage和edits文件都是经过序列化的,在NameNode启动的时候,它会将fsimage文件中的所有内容加载到内存中,之后再执行edits文件中的各项操作。使得内存中的元数据和实际的数据同步,存在内存中的元数据支持客户端的读操作。
在NameNode启动之后,hdfs中的更新操作会重新写到edits文件中,因为fsimage文件一般情况下都是非常大的,可以达到GB级别甚至更高,如果所有的更新操作都向fsimage中添加的话,势必会导致系统运行的越来越慢。但是如果向edits文件中写的话就不会导致这样的情况出现,每次执行写操作后,且在向客户端发送成功代码之前,edits文件都需要同步更新的。 如果一个文件比较大,会使得写操作需要向多台机器进行操作,只有当所有的写操作都执行完成之后,写操作才可以称之为成功。这样的优势就是在任何的操作下都不会因为机器的故障而导致元数据不同步的情况出现。 **fsimage包含hadoop文件系统中的所有的目录和文件IDnode的序列化信息。**对于文件来说,包含的信息有修改时间、访问时间、块大小和组成一个文件块信息等;对于目录来说,包含的信息主要有修改时间、访问控制权等信息。fsimage并不包含DataNode的信息,而是包含DataNode上块的映射信息,并存在内存中。当一个新的DataNode加入集群时,DataNode都会向NameNode提供块的信息,并且NameNode也会定期的获取块的信息,以便NameNode拥有最新的块映射信息。又因为fsimage包含hadoop文件系统中的所有目录和文件IDnode的序列化信息,所有一旦fsimage出现丢失或者损坏的情况,那么即使DataNode上有块的数据,但是我们没有文件到块的映射关系,所以我们也是没有办法使用DataNode上的数据。所以定期且及时的备份fsimage和edits文件非常重要.

2、流程介绍:
①、加载fsimage映像文件到内存
②、加载edits文件到内存
③、在内存将fsimage映像文件和edits文件进行合并
④、将合并后的文件写入到fsimage中
⑤、清空原先edits中的数据,使用一个空的edits文件进行正常操作

3、流程图分析:
namenode维护元数据_第1张图片
4、疑问
因为NameNode只有在启动的阶段才合并fsimage和edits,那么如果运行时间长了,edits文件可能会越来越大,在下一次启动NameNode时会花很长的时间,请问能否让fsimage映像文件和edits日志文件定期合并呢?
答案肯定是可以的,为了解决这个问题我们就要用到Secondary NameNode了,Secondary NameNode主要的作用是什么呢?他是如何将fsimage和edits进行合并的呢?带着疑问再次进行分析。

二、Secondary NameNode工作流程:

1、Secondary NameNode和NameNode的区别:

NameNode:
①、存储文件的metadata,运行时所有数据都保存在内存中,这个的HDFS可存储的文件受限于NameNode的内存。
②、NameNode失效则整个HDFS都失效了,所以要保证NameNode的可用性。
Secondary NameNode:
①、定时与NameNode进行同步,定期的将fsimage映像文件和Edits日志文件进行合并,并将合并后的传入给NameNode,替换其镜像,并清空编辑日志。如果NameNode失效,需要手动的将其设置成主机。
②、Secondary NameNode保存最新检查点的目录和NameNode的目录结构相同。所以NameNode可以在需要的时候应用Secondary NameNode上的检查点镜像。

2、什么时候checkpoint
①、连续两次的检查点最大时间间隔,默认是3600秒,可以通过配置“fs.checkpoint.period”进行修改
②、Edits日志文件的最大值,如果超过这个值就会进行合并即使不到1小时也会进行合并。可以通过“fs.checkpoint.size”来配置,默认是64M;

3、Secondary NameNode的工作流程
①、NameNode通知Secondary NameNode进行checkpoint。
②、Secondary NameNode通知NameNode切换edits日志文件,使用一个空的。
③、Secondary NameNode通过Http获取NmaeNode上的fsimage映像文件(只在第一次的时候)和切换前的edits日志文件。
④、Secondary NameNode在内容中合并fsimage和Edits文件。
⑤、Secondary NameNode将合并之后的fsimage文件发送给NameNode。
⑥、NameNode用Secondary NameNode 传来的fsImage文件替换原先的fsImage文件,并且更新fsimage文件的检查点时间。
4、流程图分析:
namenode维护元数据_第2张图片

你可能感兴趣的:(namenode维护元数据)