3

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

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

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

4

2 回答 2

3

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

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

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

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

于 2013-01-22T12:25:28.633 回答
-1

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

于 2016-06-02T22:09:10.700 回答