namenode从哪里获取datanode的信息

Posted

技术标签:

【中文标题】namenode从哪里获取datanode的信息【英文标题】:From where the namenode gets information of the datanode 【发布时间】:2018-01-07 13:42:26 【问题描述】:

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

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

【问题讨论】:

新的 fsimage 将使用增量数据生成,旧数据也将保存在这个新文件中。 感谢您的评论....但我怀疑我是否在 8:30 存储了新的大文件,并且此信息将存储在编辑日志中而不是 fsimage 中,我要求在检查点过程之前的 8:31 将相同的文件读取到 namenode ..... 现在 namenode 将从 fsimage 或 editlog 获取信息 块相关的元存储存储在 fsimage 中,editlog 用于捕获日志,即所有与 hdfs 文件系统相关的活动的摘要 【参考方案1】:

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

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

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

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

主要来源:HDFS Architecture Guide;我也是 HDFS 核心代码的贡献者。

【讨论】:

以上是关于namenode从哪里获取datanode的信息的主要内容,如果未能解决你的问题,请参考以下文章

Hadoop 从 namenode 和 datanode 文件恢复

HDFS的可靠性设计

Hadoop框架:DataNode工作机制详解

Hadoop源码学习之HDFS

DataNode生命线消息

cloudera learning5:Hadoop集群高级配置