问题背景
访问HBase服务频繁出现报错:ServerNotRunningYetException: Server emr-worker-1.cluster-300808,16020,1662065267349 is not running yet。
分析过程
1. 根据报错信息可以看到是RegionServer节点不是在运行的状态,查看RegionServer日志可以看到使用的GC算法是CMS,Full GC很频繁,且耗时长。
2.使用CMS(并发标记-清除算法)避免不了Full GC,而且Full GC场景下会通过一次串行的完整垃圾收集来回收碎片化的内存,这个过程通常会比较长,应用线程会发生长时间的STW停顿,不响应任何请求,导致RegionServer停顿。
3. 可以查RegionServer堆内存配置信息,RegionServer堆内存只配了1.5G,CMSInitiatingOccupancyFraction配置的是85,当老年代内存使用率超过85%就开始执行CMS GC。结合GC的情况来看是内存不足导致Full GC时发生长时间的STW服务停顿,如果在这个时候访问RegionServer就会出现ServerNotRunningYetException服务不可用的情况。
方案结论
建议根据业务情况配置更大的堆内存来解决。另外避免经常STW停顿的方式来FullCG,也可以考虑使用G1垃圾回收的方式。 G1适合大内存的场景,通过把堆内存划分为多个 Region,然后对各个Region单独进行GC,这样就具有了并行整理内存碎片的功能,可以最大限度的避免Full GC的到来,提供更加合理的停顿时间。
适用范围
开源大数据平台E-MapReduce