任何人都知道在Hdfs的namenode中每个文件占用多少字节? 我想估计有多少文件可以存储在32G内存的单个名称节点中。
答案 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/
答案 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上的一个块表示)被复制三次,则块文件的数量将增加三倍,但不会代表它们的块数。
示例:
来自cloudera的origin article中的更多示例文章。
答案 2 :(得分:3)
(每个文件元数据= 150bytes)+(文件的块元数据= 150bytes)= 300bytes 所以1百万个文件每个有1个块将消耗= 300 * 1000000 = 300000000bytes = 300MB,复制因子为1.复制因子为3,需要900MB。
因此,对于每1GB的拇指规则,您可以存储100万个文件。