请参考 上一个 链接地址:
hdfs为什么不擅长存储大量小文件
https://blog.51cto.com/12445535/2354951

概述:namenode replication(复制)
复制

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

关闭复制时,一个192 MB的文件占用192 MB的磁盘空间和大约450字节的内存。
//(计算方式为:128+64 也就是1个文件inode+2个块 3150 大约消耗 450字节的内存)
如果你有一百万个这样的文件,或192 TB的数据,你需要192 TB的磁盘空间,而不考虑RPC工作负载,450 MB内存:(100万inode + 200万个块)
150个字节。启用默认复制后,您需要576 TB的磁盘空间:(192 TB * 3)但内存使用率保持不变,450 MB。当您考虑簿记和RPC,并遵循每百万个块1 GB堆内存的建议时,对此方案更安全的估计是2 GB内存(有或没有复制)。


例子
示例1:估计使用的NameNode堆内存

Alice,Bob和Carl每个磁盘上都有1 GB(1024 MB)的数据,但切成不同大小的文件。 Alice和Bob的文件是块大小的一部分,需要的内存最少。 Carl没有用不必要的命名空间对象填充堆。
Alice:1 x 1024 MB文件

    1个文件inode
    8块(1024 MB / 128 MB)

总计= 9个对象* 150个字节= 1,350个字节的堆内存
Bob:8 x 128 MB文件

    8个文件inode
    8个块

总计= 16个对象* 150个字节= 2,400个字节的堆内存
Carl:1,024 x 1 MB文件

    1,024个文件inode
    1,024个街区

总计= 2,048个对象* 150个字节= 307,200个字节的堆内存

**计算实例//生产可用 根据已知磁盘大小去计算需要多大的namenode堆内存

示例2:估计所需的NameNode堆内存**

在该示例中,通过考虑群集的容量来估计存储器。值四舍五入。两个集群都物理存储4800 TB或大约3600万个块文件(默认块大小)。复制确定有多少名称空间块代表这些块文件。
群集A:每个24 TB的200个主机= 4800 TB。

    Blocksize = 128 MB,复制= 1
    以MB为单位的群集容量:200 24,000,000 MB = 4,800,000,000 MB(4800 TB)
    每个块所需的磁盘空间:每块128 MB
1 =每块128 MB存储空间
    块中的群集容量:4,800,000,000 MB / 128 MB = 36,000,000块

在容量方面,建议分配每百万个块1 GB的内存,群集A需要36 GB的最大堆空间。
群集B:每个24 TB的200个主机= 4800 TB。

    Blocksize = 128 MB,复制= 3
    以MB为单位的群集容量:200 24,000,000 MB = 4,800,000,000 MB(4800 TB)
    每个块所需的磁盘空间:每块128 MB
3 =每块384 MB存储空间
    块中的群集容量:4,800,000,000 MB / 384 MB = 12,000,000个块

在容量方面,建议为每百万个块分配1 GB内存,群集B需要12 GB的最大堆空间。

群集A和群集B都存储相同数量的块文件。但是,在群集A中,每个块文件都是唯一的,并由NameNode上的一个块表示;在群集B中,只有三分之一是唯一的,三分之二是副本。