在HDFS上保存文件时,它会拆分文件并相应存储,并将信息存储在编辑日志中,一切正常。
我的问题是:当我向namenode请求读取操作时,它将从哪里查看datanode详细信息?
从fsimage或编辑日志?
如果从fsimage查看,将以一小时的间隔生成新的fsimage
如果我在那个时间间隔之前请求它,会发生什么?
答案 0 :(得分:0)
让我们分析关于文件系统的每一点信息都存储在NameNode上的信息。
文件系统命名空间(目录和文件的层次结构)完全存储在NameNode上的内存中。没有磁盘缓存。一切都在记忆中。如果失败,FsImage仅用于 的持久性。它在启动时只读 。 EditLog将更改存储到FsImage;再次,EditLog在启动时只读取 。在正常操作期间,活动NameNode永远不会读取FsImage或EditLog。但是,BackupNode或Standby NameNode(取决于您的配置)会定期将新的EditLog条目与旧的FsImage组合以生成新的FsImage。这样做是为了使启动更快并减少磁盘上数据结构的大小(如果没有进行压缩,EditLog的大小将无限增长)。
上面讨论的命名空间包括从文件到该文件中包含的块的映射。此信息保留在FsImage / EditLog中。但是,这些块的位置不会保留在FsImage 中。此信息仅在NameNode的内存中短暂存在 。在启动时,使用从所有DataNode接收的块报告来重建块的位置。每个DataNode本质上都告诉NameNode,"我有块ID AAA,BBB,CCC,..."依此类推,NameNode使用这些报告来构建所有块的位置。
简单地回答您的问题,当您从NameNode请求读取操作时,将从内存中读取所有信息。磁盘I / O仅在写操作时执行,以将更改保留到EditLog。
主要来源:HDFS Architecture Guide;我也是HDFS核心代码的贡献者。