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