1.NameNode 中的元数据

​ 元数据存储着hdfs 的目录结构及每一个文件的块信息(如块的id、块的副本数量、块的存放位置

​ 元数据由NameNode负责管理,由于元数据经常需要进行随机访问与响应客户请求,若存储在NameNode节点的磁盘中,效率必然过低,因此元数据需要存放在内存中。但如果只存放在内存中,一旦断电,元数据丢失,整个集群就无法工作了,因此产生了在磁盘中负责备份元数据的FsImage

​ 这样又会带来新的问题,当在内存中的元数据更新时,如果同时更新FsImage,就会导致效率过低,但如果不更新,就会发生一致性问题,一旦NameNode节点断电,就会产生数据丢失。因此,引入Edits文件(只进行追加操作,效率很高)。每当元数据有更新或者添加元数据时,修改内存中的元数据并追加到Edits中,这样,一旦NameNode节点断电,可以通过FsImage和Edits的合并,合成元数据。

​ 但是,如果长时间添加数据到 Edits 中,会导致该文件数据过大,效率降低,而且一旦断电,恢复元数据需要的时间过长。因此,需要定期进行 FsImage 和 Edits 的合并,如果这个操作NameNode节点完成,又会效率过低。因此,引入一个新的节点SecondaryNamenode,专门用于 FsImage 和 Edits 的合并。

2.工作流程

  1. 第一阶段:NameNode启动
  1. 第一次启动 NameNode 格式化后,创建 Fsimage 和 Edits 文件。如果不是第一次启动,直接加载编辑日志和镜像文件到内存。
  2. 客户端对元数据进行增删改的请求。
  3. NameNode 记录操作日志,更新滚动日志。
  4. NameNode 在内存中对元数据进行增删改。
  1. 第二阶段: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。

3.NN和2NN工作机制详解

Fsimage:NameNode 内存中元数据序列化后形成的文件。

Edits:记录客户端更新元数据信息的每一步操作(可通过 Edits 运算出元数据)。

​ NameNode 启动时,先滚动 Edits 并生成一个空的 edits.inprogress,然后加载 Edits 和Fsimage 到内存中,此时 NameNode 内存就持有最新的元数据信息。Client 开始对NameNode 发送元数据的增删改的请求,这些请求的操作首先会被记录到 edits.inprogress中(查询元数据的操作不会被记录在 Edits 中,因为查询操作不会更改元数据信息),如果此时 NameNode 挂掉,重启后会从 Edits 中读取元数据的信息。然后,NameNode 会在内存中执行元数据的增删改的操作。

​ 由于 Edits 中记录的操作会越来越多,Edits 文件会越来越大,导致 NameNode 在启动加载 Edits 时会很慢,所以需要对 Edits 和 Fsimage 进行合并(所谓合并,就是将 Edits 和Fsimage 加载到内存中,照着 Edits 中的操作一步步执行,最终形成新的 Fsimage)。SecondaryNameNode 的作用就是帮助 NameNode 进行 Edits 和 Fsimage 的合并工作。

​ SecondaryNameNode 首先会询问 NameNode 是否需要 CheckPoint(触发 CheckPoint需要满足两个条件中的任意一个,定时时间到和 Edits 中数据写满了)。直接带回NameNode 是否检查结果。SecondaryNameNode 执行 CheckPoint 操作,首先会让 NameNode滚动 Edits 并生成一个空的 edits.inprogress,滚动 Edits 的目的是给 Edits 打个标记,以后所有新的操作都写入 edits.inprogress,其他未合并的 Edits 和 Fsimage 会拷贝到SecondaryNameNode 的本地,然后将拷贝的 Edits 和 Fsimage 加载到内存中进行合并,生成 fsimage.chkpoint,然后将 fsimage.chkpoint 拷贝给 NameNode,重命名为 Fsimage 后替换掉原来的 Fsimage。NameNode 在启动时就只需要加载之前未合并的 Edits 和 Fsimage即可,因为合并过的 Edits 中的元数据信息已经被记录在 Fsimage 中。

4.Secondary NameNode的工作时间

  1. 通常情况下,Secondary NameNode每隔一个小时工作一次,可以在hdfs-default.xml中设置:
<property>
 <name>dfs.namenode.checkpoint.period</name>
 <value>3600s</value>
</property>
  1. 一分钟检查一次操作次数,当操作次数达到一百万时,SecondaryNameNode也会直接工作,同样可以在hdfs-default.xml中设置:
<property>
 <name>dfs.namenode.checkpoint.txns</name>
 <value>1000000</value>
<description>操作动作次数</description>
</property>
<property>
 <name>dfs.namenode.checkpoint.check.period</name>
 <value>60s</value>
<description> 1 分钟检查一次操作次数</description>
</property >

5.NameNode多目录配置

NameNode 的本地目录可以配置成多个,且每个目录存放内容相同,可以增加可靠性

配置方法:

  1. 在 hdfs-site.xml 文件中添加如下内容
<property>
<name>dfs.namenode.name.dir</name>
<value>file://${hadoop.tmp.dir}/dfs/name1,file://${hadoop.tmp.dir}/df
s/name2</value>
</property>
  1. 停止集群,删除三台节点的 data 和 logs 中所有数据。
[pbh@hadoop102 hadoop-3.1.3]$ rm -rf data/ logs/
[pbh@hadoop103 hadoop-3.1.3]$ rm -rf data/ logs/
[pbh@hadoop104 hadoop-3.1.3]$ rm -rf data/ logs/
  1. 格式化集群并启动
[pbh@hadoop102 hadoop-3.1.3]$ bin/hdfs namenode –format
[pbh@hadoop102 hadoop-3.1.3]$ sbin/start-dfs.sh
  1. 查看结果
[pbh@hadoop102 dfs]$ ll
总用量 12
drwx------. 3 pbh pbh 4096 12 月 11 08:03 data
drwxrwxr-x. 3 pbh pbh 4096 12 月 11 08:03 name1
drwxrwxr-x. 3 pbh pbh 4096 12 月 11 08:03 name2
最后修改:2022 年 08 月 22 日
如果觉得我的文章对你有用,请随意赞赏