有人知道Hdfs的namenode中每个文件占用多少字节吗?我想估计在 32G 内存的单个 namenode 中可以存储多少文件。
3 回答
每个文件或目录或块在名称节点内存中占用大约 150 个字节。[1] 因此,具有 32G RAM 的 namenode 的集群最多可以支持(假设 namenode 是瓶颈)大约 3800 万个文件。(每个文件也会占用一个块,所以每个文件实际上占用 300 字节。我也假设 3x 复制。所以每个文件占用 900 字节)
然而,在实践中,这个数字会少得多,因为所有 32G 都不能用于 namenode 来保持映射。您可以通过为该机器中的名称节点分配更多堆空间来增加它。
复制也会在较小程度上影响这一点。每个额外的副本都会增加大约 16 个字节的内存需求。[2]
Cloudera 建议每百万块使用 1 GB 的 NameNode 堆空间。每百万个文件 1 GB 不太保守,但也应该有效。
此外,您不需要乘以复制因子,接受的答案是错误的。
使用 128 MB 的默认块大小,将 192 MB 的文件拆分为两个块文件,一个 128 MB 文件和一个 64 MB 文件。在 NameNode 上,命名空间对象是通过文件和块的数量来衡量的。相同的 192 MB 文件由三个命名空间对象(1 个文件 inode + 2 个块)表示,并消耗大约 450 字节的内存。
一个 128 MB 的数据文件由 NameNode 上的两个命名空间对象(1 个文件 inode + 1 个块)表示,并消耗大约 300 字节的内存。相比之下,128 个 1 MB 的文件由 256 个命名空间对象(128 个文件 inode + 128 个块)表示,大约消耗 38,400 个字节。
复制会影响磁盘空间,但不会影响内存消耗。复制会更改每个块所需的存储量,但不会更改块的数量。如果 DataNode 上的一个块文件,由 NameNode 上的一个块表示,被复制了 3 次,则块文件的数量增加了三倍,但代表它们的块的数量没有增加。
例子:
- 1 x 1024 MB 文件 1 个文件 inode 8 个块 (1024 MB / 128 MB) 总计 = 9 个对象 * 150 字节 = 1,350 字节的堆内存
- 8 x 128 MB 文件 8 个文件 inode 8 个块 总计 = 16 个对象 * 150 字节 = 2,400 字节的堆内存
- 1,024 x 1 MB 文件 1,024 个文件 inode 1,024 个块 总计 = 2,048 个对象 * 150 字节 = 307,200 字节堆内存
来自 cloudera的原始文章中的更多示例文章。
(Each file metadata = 150bytes) + (block metadata for the file=150bytes)=300bytes so 1million files each with 1 block will consume=300*1000000=300000000bytes =300MB for replication factor of 1. with replication factor of 3 it requires 900MB.
So as thumb rule for every 1GB you can store 1million files.