在对 NameNode 节点进行格式化时, 调用了 FSImage 的 saveFSImage()方法和 FSEditLog.createEditLogFile()存储当前的元数据. Namenode 主要维护两个文件, 一个是 fsimage, 一个是 editlog.
fsimage : 保存了最新的元数据检查点, 包含了整个 HDFS 文件系统的所有目录和文件的信息. 对于文件来说包括了数据块描述信息, 修改时间, 访问时间等; 对于目录来说包括修改时间, 访问权限控制信息 (目录所属用户, 所在组) 等. 简单的说, Fsimage 就是在某一时刻, 整个 hdfs 的快照, 就是这个时刻 hdfs 上所有的文件块和目录, 分别的状态, 位于哪些个 datanode, 各自的权限, 各自的副本个数等.
注意: Block 的位置信息不会保存到 fsimage,Block 保存在哪个 DataNode(由 DataNode 启动时上报).
editlog : 主要是在 NameNode 已经启动情况下对 HDFS 进行的各种更新操作进行记录, HDFS 客户端执行所有的写操作都会被记录到 editlog 中.
读取元数据:
启动 NameNode 节点时, 又要从镜像和编辑日志中读取元数据.
写入元数据:
在 NameNode 运行时会将内存中的元数据信息存储到所指定的文件, 即 ${dfs.name.dir}/current 目录下的 fsimage 文件, 此外还会将另外一部分对 NameNode 更改的日志信息存储到 ${dfs.name.dir}/current 目录下的 edits 文件中. fsimage 文件和 edits 文件可以确定 NameNode 节点当前的状态, 这样在 NameNode 节点由于突发原因崩溃时, 可以根据这两个文件中的内容恢复到节点崩溃前的状态, 所以对 NameNode 节点中内存元数据的每次修改都必须保存下来. 但是如果每次都保存到 fsimage 文件中, 这样效率就特别低效, 所以引入编辑日志文件 edits, 保存对对元数据的修改信息, 也就是 fsimage 文件保存 NameNode 节点中某一时刻内存中的元数据(即目录树),edits 保存这一时刻之后的对元数据的更改信息.
SecondaryNameNode: 主要由两个作用, 一是镜像备份(不是 NN 的备份, 但可以做备份), 二是日志与镜像的定期合并.
第一步: 将 hdfs 更新记录写入一个新的文件 --edits.new.
第二步: 将 fsimage 和 editlog 通过 http 协议发送至 secondary namenode.
第三步: 将 fsimage 与 editlog 合并, 生成一个新的文件 --fsimage.ckpt. 这步之所以要在 secondary namenode 中进行, 是因为比较耗时, 如果在 namenode 中进行, 或导致整个系统卡顿.
第四步: 将生成的 fsimage.ckpt 通过 http 协议发送至 namenode.
第五步: 重命名 fsimage.ckpt 为 fsimage,edits.new 为 edits.
第六步: 等待下一次 checkpoint 触发 SecondaryNameNode 进行工作, 一直这样循环操作.
注: checkpoint 触发的条件可以在 core-site.xml 文件中进行配置. fs.checkpoint.period 表示多长时间记录一次 hdfs 的镜像. 默认是 1 小时. fs.checkpoint.size 表示一次记录多大的 size, 默认 64M. 例如如下:
- fs.checkpoint.period
- 3600
- The number of seconds between two periodic checkpoints.
- fs.checkpoint.size
- 67108864
- The size of the current edit log (in bytes) that triggers
- a periodic checkpoint even if the fs.checkpoint.period hasn't expired.
客户端上传文件时, namenode 首先往 edits log 写入文件中记录元数据操作日志.
客户端开始上传文件, 完成后返回成功信息给 namenode,namenode 就在内存中写入这次上传操作新产生的操作日志.
每当 edits log 写满时, 需要将这一段时间的新的元数据刷新到 fsimage 文件中, 就是将 edits log 和 fsimage 做合并.
流程图:
来源: http://bigdata.51cto.com/art/201909/603385.htm