Namenode文件数量限制

bil*_*low 5 hadoop namenode

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

Har*_*non 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


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

复制影响磁盘空间但不影响内存消耗.复制会更改每个块所需的存储量,但不会更改块的数量.如果一个数据节点,通过在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个字节的堆内存

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