Namenode文件数量限制

时间:2012-05-26 07:36:04

标签: hadoop namenode

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

3 个答案:

答案 0 :(得分:9)

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

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

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

[1] http://www.cloudera.com/blog/2009/02/the-small-files-problem/

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

答案 1 :(得分:6)

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个字节的内存。相比之下,每个1 MB的128个文件由256个命名空间对象(128个文件inode + 128个块)表示,并消耗大约38,400个字节。

     

复制影响磁盘空间但不影响内存消耗。复制会更改每个块所需的存储量,但不会更改块的数量。如果DataNode上的一个块文件(由NameNode上的一个块表示)被复制三次,则块文件的数量将增加三倍,但不会代表它们的块数。

示例:

  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个字节的堆内存
  4. 来自cloudera的origin article中的更多示例文章。

答案 2 :(得分:3)

(每个文件元数据= 150bytes)+(文件的块元数据= 150bytes)= 300bytes 所以1百万个文件每个有1个块将消耗= 300 * 1000000 = 300000000bytes                                                              = 300MB,复制因子为1.复制因子为3,需要900MB。

因此,对于每1GB的拇指规则,您可以存储100万个文件。