Namenode对所有文件块的元数据存储

Posted

技术标签:

【中文标题】Namenode对所有文件块的元数据存储【英文标题】:Metadata storage by Namenode for all file blocks 【发布时间】:2013-01-22 08:32:28 【问题描述】:

在阅读 Hadoop: The Definitive Guide 一书时,我遇到了page,其中包含以下内容:

namenode 还知道给定文件的所有块所在的数据节点,但是,它不会永久存储块位置,因为这些信息是在系统启动时从数据节点重建的

我很难理解这是如何工作的。假设我在一个 8 节点集群上复制了一个 1 GB 的文件,复制因子为 3。所以每个数据节点将有 1 个块,这些块将被复制到其他节点上,使每个节点上的块总数有效地达到 3 . 现在namenode应该保存一个包含每个块位置的索引。但是根据文中的说法,如果namenode没有持久存储block位置,那么在集群关闭重启后,它们是如何重建的。没有办法知道哪个块属于哪个文件。有人可以向我解释一下吗?

【问题讨论】:

【参考方案1】:

namenode 确实保留了有关文件的一些状态(名称、路径、大小、块大小、块 ID 等),而不是块所在的物理位置。

当数据节点启动时,它们会有效地遍历 dfs 数据目录,发现它们拥有的所有文件块,一旦完成,就会向名称节点报告它所托管的块。

namenode 构建文件映射以阻止来自每个数据节点的报告中的位置。

这是集群首次启动时有时需要几分钟才能退出安全模式的原因之一 - 如果您有很多文件,每个数据节点可能需要一些时间来遍历树并发现它托管的块。

【讨论】:

感谢您的解释。有帮助!【参考方案2】:

每个 fsimage 文件都包含文件系统中所有目录和文件 inode 的序列化形式。每个 inode 是文件或目录元数据的内部表示,包含文件的复制级别、修改和访问时间、访问权限、块大小以及文件组成的块等信息。对于目录,存储的是修改时间、权限和配额元数据。fsimage 文件不记录存储块的数据节点。相反,namenode 将此映射保存在内存中,它通过在 datanode 加入集群时询问其块列表来构建它,并在之后定期确保 namenode 的块映射是最新的。

【讨论】:

这个答案需要明确说明它是直接引用自 Tom White 的 Hadoop: the Definitive Guide 的。而且我不相信它回答了这个问题:OP 知道 fsimage 和 namenode 都没有将数据节点记录在永久存储中,并且正在询问是什么。

以上是关于Namenode对所有文件块的元数据存储的主要内容,如果未能解决你的问题,请参考以下文章

Namenode的元数据存储

HDFS概述

HDFS概述

Hadoop源码学习之HDFS

hadoop小文件存档

HDFS解决小文件