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

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

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

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

【问题讨论】:

    标签: hadoop hdfs


    【解决方案1】:

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

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

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

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

    【讨论】:

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

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

    【讨论】:

    • 这个答案需要明确说明它是直接引用自 Tom White 的 Hadoop: the Definitive Guide 的。而且我不相信它回答了这个问题:OP 知道 fsimage 和 namenode 都没有将数据节点记录在永久存储中,并且正在询问是什么。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-05-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-01
    相关资源
    最近更新 更多