感谢大家的意见。我已经对该主题进行了一些研究并分享了我的发现。
- 任何静态数字都是幻数。我建议块阈值的数量为:堆内存(以 gb 为单位)x 100 万 *comfort_%age(比如 50%)
为什么?
经验法则:1M 块 1gb,Cloudera [1]
namenode 实际所需的堆内存量要低得多。
所需堆 =(块数 + inode(文件 + 文件夹))x 对象大小(150-300 字节 [1])
对于 100 万个小文件:所需堆 = (1M + 1M) x 300b = 572mb
- 高块数可能同时表明两者。
namenode UI 说明使用的堆容量。
例如,
http://namenode:50070/dfshealth.html#tab-overview
9,847,555 个文件和目录,6,827,152 个块 = 16,674,707 个文件系统对象。
堆内存使用 5.82 GB 的 15.85 GB 堆内存。最大堆内存为 15.85 GB。
** 注意,使用的堆内存仍然高于 16,674,707 个对象 x 300 字节 = 4.65gb
要找出小文件,请执行
hdfs fsck -blocks | grep "总块数(已验证):"
它会返回如下内容:
总块(已验证):2402(平均块大小 325594 B)
- 是的。如果文件大小 ,则文件很小
- 每个文件在磁盘上占用一个新数据块,尽管块大小接近文件大小。这么小的街区。
- 对于每一个新文件,都会创建一个inode类型的对象(150B),所以要强调name node的堆内存
对名称和数据节点的影响:
小文件会给名称节点和数据节点带来问题:
命名节点:
- 拉低文件数量的上限,因为它需要将每个文件的元数据保留在内存中
- 重启时间过长,因为它必须从本地磁盘上的缓存中读取每个文件的元数据
数据节点:
- 大量的小文件意味着大量的随机磁盘 IO。 HDFS 专为大文件而设计,并受益于顺序读取。
[1]https://www.cloudera.com/documentation/enterprise/5-8-x/topics/admin_nn_memory_config.html