问题背景与现象
上层组件访问HDFS缓慢,怀疑HDFS有性能问题。
可能原因
HDFS的存储的对象数超过NameNode配置的内存。
原因分析
- NameNode中文件对象需要占用一定的内存,消耗内存大小随文件对象的生成而线性递增。NameNode中,文件对象可以是文件、目录或者Block。在NameNode WebUI界面的Summary也可以看到文件系统对象(filesystem objects)的统计。
- 从Manager访问“Services > HDFS status > NameNode(Active) ”的Summary 页面查看HDFS的“Files and Directories ”以及“Block”的情况。
- 确认总对象数量是否超过NameNode内存配置值。NameNode内存配置参考值和文件对象数量关系如下
说明:文件数量
(1文件对应1block)
文件系统对象数量(filesystem objects=files+blocks)
参考值
5,000,000
10,000,000
-Xms6G -Xmx6G -XX:NewSize=512M -XX:MaxNewSize=512M
10,000,000
20,000,000
-Xms12G -Xmx12G -XX:NewSize=1G -XX:MaxNewSize=1G
25,000,000
50,000,000
-Xms32G -Xmx32G -XX:NewSize=3G -XX:MaxNewSize=3G
50,000,000
100,000,000
-Xms64G -Xmx64G -XX:NewSize=6G -XX:MaxNewSize=6G
100,000,000
200,000,000
-Xms96G -Xmx96G -XX:NewSize=9G -XX:MaxNewSize=9G
150,000,000
300,000,000
-Xms164G -Xmx164G -XX:NewSize=12G -XX:MaxNewSize=12G
- 文件系统对象数量 filesystem objects=files+blocks ;因此文件对象数量一般是文件数一倍以上。
- 如果修改NameNode的GC_OPTS,参考如上表格只修改GC_OPTS的前四位。
解决办法
- 确认并调整NameNode内存:
如果内存配置不合理,需要参考表格调整NameNode服务端的GC_OPTS的前4位,并重启NameNode生效(重启NameNode过程中,HDFS服务不可用,需中断业务)。
- 调整内存需同时调整监控转告警阈值。
以适应当前NameNode内存对应的文件上限。(“调整告警阈值”步骤不会重启组件,因此不会影响业务)。
说明:“调整告警阈值”步骤不会重启组件,因此不会影响业务。
- 如果无法增加内存,可以删除集群中无用文件,减少集群中的文件对象数量。