暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

HDFS 的元数据管理(FSImage、Edits、CheckPoint)

原创 大鱼 2021-08-26
2578

1 - NameNode 的元数据
NameNode 的所有操作及整个集群的状态都存储在 元数据 中,元数据通过 FSImage 和 Eidts 文件保存。
它们的主要作用是:在集群启动时将集群的状态恢复到关闭前的状态。
—— 也就是 Hadoop 集群因为各种原因需要重新启动,元数据能保证集群启动之后的状态和上次停止前的状态一致。
第一次启动 NameNode 前的格式化(hdfs namenode -format)操作会创建 fsimage 和 edits 文件。
非第一次启动,NameNode 会进行数据恢复:首先把 fsimage 加载到内存中形成文件系统镜像,然后再把 edits 中 fsimage_txid 之后的、所有事务 回放到这个文件系统镜像上。这个时候,集群也就恢复到关闭前的状态了。
它们的位置需要在 hdfs-site.xml 文件中指定:

dfs.namenode.name.dir file:/Users/healchow/data/hadoop/namenode dfs.namenode.edits.dir file:/Users/healchow/data/hadoop/namenode/edits 1.1 FSImage 元数据镜像 1)FSImage 是 NameNode 中关于元数据的镜像,一般称为检查点的镜像;会在内存和磁盘中各保存一份; 2)FSImage 是 NameNode 自最后一次 CheckPoint 之前的全部元数据,并不是实时的数据; 3)FSImage 保存了 NameNode 管理下的所有 DataNode 的文件和目录信息: 对文件来说:包括文件的 block、各个 block 所在的 DataNode,以及它们的修改时间、访问时间等; 对目录来说:包括修改时间、访问权限控制信息(权限、属组)等。 FSImage 默认会保存2个,由属性 dfs.namenode.num.checkpoints.retained 控制。 内存中的 FSImage 用于 NameNode 向客户端提供读服务,而 EditLog 仅仅只是在数据恢复的时候发挥作用。 1.2 查看 FSImage 文件 FSImage 文件的文件名形如 fsimage_${end_txid},其中 ${end_txid} 表示这个 FSImage 文件中的最后一个事务的 id。 查看 FSImage 文件中的信息: hdfs oev 回车后会显示命令的帮助信息: cd ~/bigdata/data/hadoop/namenode hdfs oiv -i fsimage_0000000000000000864 -p XML -o hello.xml 1.3 Edits 操作日志 1)客户端对 HDFS 的写操作会先记录到 edits 文件中 —— 自最后一次检查点之后的所有操作,有实时数据; HDFS 客户端提交的创建、移动、删除文件等 写操作 的时候,NameNode 会首先把这些操作记录在 edits 文件中。 2)edits 修改完成之后,会再更新内存中的文件系统镜像; edits 文件会不断增大(导致系统运行、重启恢复等过程非常缓慢),在一定条件下会和 fsimage 文件合并,从而减小 edits 文件的体积。 3)记录在 edits 中的每一个操作又称为一个事务,每个事务有一个整数形式的事务 id 作为编号。 (临时总结,不一定对)EditLog 就是事务日志,主要作用是用来记录写操作,以支持系统的恢复。 1.4 查看 Edits 文件 Edits 会被切割成很多段,每一段称为一个 Segment。正在写入的 Segment 处于 in-progress 状态,其文件名形如 edits_inprogress_${start_txid},其中 ​${start_txid} 表示这个 Segment 的起始事务 id。 已经写入完成的 Segment 处于 finalized 状态,其文件名形如 edits_${start_txid}-${end_txid},其中 ${start_txid} 表示这个 Segment 的起始事务 id,${end_txid} 表示这个 Segment 的结束事务 id。 查看 Edits 中的文件信息 hdfs oev 回车后会显示命令的帮助信息: cd ~/data/hadoop/namenode hdfs oev -i edits_0000000000000000865-0000000000000000866 -p XML -o myedit.xml 2 - NameNode 的启动流程 1)Loading FSImage - 从 FSImage File 中读取最新的元数据快照(最近生成的 fsimage_txid); 2)Loading Edits - 读取 fsimage_txid 之后的所有事务的 Eidts,将 Eidts 中的操作重新执行一遍,此时 NameNode 就恢复到上次停止时的状态了; 3)CheckPoint - 将当前状态写入新的 CheckPoint (检查点)中,即产生一个新的 fsimage.ckpt_txid 文件; 4)Safe mode - 等待各个 DataNodes 汇报自己的 block 信息,形成 blockMap,然后退出安全模式。 此时 NameNode 启动结束,等待接受用户的操作请求,并把用户操作写入新的 Eidts 中,定期进行 CheckPoint,对元数据执行快照。
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论