namenode性能问题

影响namenode内存主要因素:

NameNode常驻内存主要被Namespace和BlockManager使用,二者使用占比分别接近50%。其它部分内存开销较小且相对固定,与Namespace和BlockManager相比基本可以忽略。

Namespace:维护整个文件系统的目录树结构及目录树上的状态变化;
BlockManager
:维护整个文件系统中与数据块相关的信息及数据块的状态变化;


数据增长namenode面临的问题:

随着集群中数据规模的不断积累,NameNode内存占用随之成比例增长。不可避免的NameNode内存将逐渐成为集群发展的瓶颈,并开始暴漏诸多问题。

1、启动时间变长。

2、性能开始下降。

3、NameNode JVM FGC(Full GC)风险较高。

 

1、启动时间变长。NameNode的启动过程可以分成FsImage数据加载、editlogs回放、Checkpoint、DataNode的BlockReport几个阶段。数据规模较小时,启动时间可以控制在~10min以内,当元数据规模达到5亿(Namespace中INode数超过2亿,Block数接近3亿),FsImage文件大小将接近到20GB,加载FsImage数据就需要~14min,Checkpoint需要~6min,再加上其它阶段整个重启过程将持续~50min,极端情况甚至超过60min,虽然经过多轮优化重启过程已经能够稳定在~30min,但也非常耗时。如果数据规模继续增加,启动过程将同步增加。

2、性能开始下降。HDFS文件系统的所有元数据相关操作基本上均在NameNode端完成,当数据规模的增加致内存占用变大后,元数据的增删改查性能会出现下降,且这种下降趋势会因规模效应及复杂的处理逻辑被放大,相对复杂的RPC请求(如addblock)性能下降更加明显。

3、NameNode JVM FGC(Full GC)风险较高。主要体现在两个方面:(1)FGC频率增加;(2)FGC时间增加且风险不可控。针对NameNode的应用场景,目前看CMS内存回收算法比较主流,正常情况下,对超过100GB内存进行回收处理时,可以控制到秒级别的停顿时间,但是如果回收失败被降级到串行内存回收时,应用的停顿时间将达到数百秒,这对应用本身是致命的。

4、超大JVM Heap Size调试问题。如果线上集群性能表现变差,不得不通过分析内存才能得到结论时,会成为一件异常困难的事情。且不说Dump本身极其费时费力,Dump超大内存时存在极大概率使NameNode不可服务。


建议:

1、合并小文件。正如前面提到,目录/文件和Block均会占用NameNode内存空间,大量小文件会降低内存使用效率;另外,小文件的读写性能远远低于大文件的读写,主要原因对小文件读写需要在多个数据源切换,严重影响性能。

2、调整合适的BlockSize。主要针对集群内文件较大的业务场景,可以通过调整默认的BlockSize大小(参数:dfs.blocksize,默认128M),降低NameNode的内存增长趋势。

3、HDFS Federation方案。当集群和数据均达到一定规模时,仅通过垂直扩展NameNode已不能很好的支持业务发展,可以考虑HDFS Federation方案实现对NameNode的水平扩展,在解决NameNode的内存问题的同时通过Federation可以达到良好的隔离性,不会因为单一应用压垮整集群。



假设HDFS目录和文件数分别为1亿,Block总量在1亿情况下,整个NamespaceJVM中内存使用情况:

Total(Directory) = (24 + 96 + 44 + 48) 100M + 8 num(total children)
Total(Files) = (24 + 96 + 48)
100M + 8 num(total blocks)
Total = (24 + 96 + 44 +
48) 100M + 8 num(total children) + (24 + 96 + 48) 100M + 8 num(totalblocks) = ~38G


供参考的NameNode内存数据空间占用预估模型:

Total =198 num(Directory + Files) +176 num(blocks) + 2% size(JVM Memory Size)



总结:

        随着数据规模的增加致使内存占用增大,元数据的增删改查性能会出现下降,namenode使用内存主要受namespace和blockmanager影响,其他几乎可以忽略,也就是文件和目录的数量和block的数量影响namenode内存。根据网上资料猜想,当block数量达到亿级的时候开始出现性能问题,元数据规模达到5亿左右,FsImage文件大小接近20G,启动各个阶段时间变长,估计性能也开始下降,建议定期合并小文件,调整合适的block大小。



你可能感兴趣的:(大数据)