6

有人知道Hdfs的namenode中每个文件占用多少字节吗?我想估计在 32G 内存的单个 namenode 中可以存储多少文件。

4

3 回答 3

12

每个文件或目录或块在名称节点内存中占用大约 150 个字节。[1] 因此,具有 32G RAM 的 namenode 的集群最多可以支持(假设 namenode 是瓶颈)大约 3800 万个文件。(每个文件也会占用一个块,所以每个文件实际上占用 300 字节。我也假设 3x 复制。所以每个文件占用 900 字节)

然而,在实践中,这个数字会少得多,因为所有 32G 都不能用于 namenode 来保持映射。您可以通过为该机器中的名称节点分配更多堆空间来增加它。

复制也会在较小程度上影响这一点。每个额外的副本都会增加大约 16 个字节的内存需求。[2]

[1] https://blog.cloudera.com/small-files-big-foils-addressing-the-associated-metadata-and-application-challenges/

[2] http://search-hadoop.com/c/HDFS:/src/main/java/org/apache/hadoop/hdfs/server/blockmanagement/BlockInfo.java%7C%7CBlockInfo

于 2012-05-26T10:54:07.060 回答
7

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. 1 x 1024 MB 文件 1 个文件 inode 8 个块 (1024 MB / 128 MB) 总计 = 9 个对象 * 150 字节 = 1,350 字节的堆内存
  2. 8 x 128 MB 文件 8 个文件 inode 8 个块 总计 = 16 个对象 * 150 字节 = 2,400 字节的堆内存
  3. 1,024 x 1 MB 文件 1,024 个文件 inode 1,024 个块 总计 = 2,048 个对象 * 150 字节 = 307,200 字节堆内存

来自 cloudera的原始文章中的更多示例文章。

于 2016-09-01T20:55:58.623 回答
4

(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.

于 2015-07-25T20:32:52.413 回答