1

在 HDFS 上保存文件时,它会拆分文件并相应地存储并将信息存储在编辑日志中,一切都很好。

我的问题是:当我向namenode请求读取操作时,它将从哪里查看datanode的详细信息?
来自 fsimage 还是编辑日志?
如果是从 fsimage 看,每隔一小时会生成一个新的 fsimage。
如果我在那个时间间隔之前请求它,会发生什么?

4

1 回答 1

0

让我们分解关于文件系统的每一位信息存储在 NameNode 上的位置。

文件系统命名空间(目录和文件的层次结构)完全存储在 NameNode 的内存中。没有磁盘缓存。一切都在记忆中。FsImage用于在失败的情况下保持持久性。它在启动时只读。EditLog 存储对 FsImage 的更改;同样,EditLog在启动时是只读的。活动 NameNode 在正常操作期间永远不会读取 FsImage 或 EditLog。但是,BackupNode备用 NameNode(取决于您的配置)将定期将新的 EditLog 条目与旧的 FsImage 组合以生成新的 FsImage。这样做是为了加快启动速度并减少磁盘数据结构的大小(如果没有进行压缩,EditLog 的大小将无限增长)。

上面讨论的命名空间包括从文件到包含在该文件中的块的映射。此信息保存在 FsImage / EditLog 中。但是,这些块的位置不会保留在 FsImage中。此信息仅暂时存在于 NameNode 的内存中。在启动时,使用从所有 DataNode 接收到的块报告重建块的位置。每个 DataNode 本质上都告诉 NameNode,“我有块 ID AAA、BBB、CCC、……”等等,NameNode 使用这些报告来构造所有块的位置。

为了简单地回答您的问题,当您从 NameNode 请求读取操作时,所有信息都是从内存中读取的。磁盘 I/O 仅在写入操作时执行,以将更改持久保存到 EditLog。

主要来源:HDFS 架构指南;我也是 HDFS 核心代码的贡献者。

于 2018-01-11T18:17:56.090 回答