所有文件块的namenode元数据存储

bprjcwpo  于 2021-06-04  发布在  Hadoop
关注(0)|答案(2)|浏览(378)

在阅读《hadoop:权威指南》一书时,我看到这一页有以下几行:
namenode还知道给定文件的所有块所在的datanode,但是,它不会持久地存储块位置,因为在系统启动时,这些信息是从datanode重建的。
我很难理解这是怎么回事。假设我在一个8节点的集群上复制一个1GB的文件,复制因子为3。因此,每个datanode将有1个块,这些块将被复制到其他节点上,从而使每个节点上的块总数有效地增加到3个。现在namenode应该保留一个包含每个块位置的索引。但是根据文本,如果namenode不持久地存储块位置,那么在集群关闭并重新启动之后,如何重构它们。无法判断哪个块属于哪个文件。有人能给我解释一下吗?

6qftjkof

6qftjkof1#

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

tnkciper

tnkciper2#

namenode确实保留了一些关于文件的状态(名称、路径、大小、块大小、块id等),而不是块所在的物理位置。
当数据节点启动时,它们有效地在dfs数据目录中进行树遍历,发现它们拥有的所有文件块,一旦完成,就会向name节点报告它所承载的块。
namenode构建文件的Map,以阻止来自每个数据节点的报告的位置。
这就是为什么当集群第一次启动时,有时需要几分钟才能从安全模式中出来的原因之一—如果您有很多文件,则每个数据节点可能需要几分钟才能进行树遍历并发现其承载的块。

相关问题