Hiveserver FullGC一直处于恢复中问题分析
问题描述:
有hiveserver反复处于恢复中,分析该hiveserver日志发现频繁的FullGC,hiveserver的GC配置为64GB。
问题分析:
1. 观察hiveserver监控,发现在较短时间内hiveserver内存使用率快速升高。根据内存骤升初步推测为业务导致。
2. 取得hiveserver故障节点对应的内存dump日志 及 hiveserver运行日志进行分析。
3. 根据传回的63g dump文件分析可见,存在线程Thread-3373220占用内存60g+,推测该线程持有内存过大导致出现FullGc.
4. 在日志中找到该线程对应的线索,发现具体业务sql为:
create table tb_sub_foreign_usernum_step7 as select t2.usernum, t2.imsi, t2.homearea, t1.url, t1.host, t1.title, from_unixtime(t1.capture_time) as capture_time, t3.type from (select msisdn, url, host, title, capture_time from default.tb_http where cp>='2020091700' and cp<'2020100100') t1 join tb_sub_foreign_usernum t2 on t1.msisdn=t2.usernum join tb_foreign_illegal_url t3 where t1.url like concat(t3.url, '%');
5. 继续分析dump日志,发现HdfsLocatedFileStatus对象有600w加数量,查看单个该文件看约占10k大小, 总共占用内存60g+,断定是由该对象耗尽了内存。
6. 根据日志及dump分析的堆栈,发现此处为获取数据文件路径的逻辑,查看sql对应的2020091700分区目录,发现该1小时分区下即存在6w+文件,sql查询9月17到9月31共15天即360小时,360个分区的文件。
每个分区下可能存在数万个文件,导致文件总数超过600w+,进而内存耗尽出现FullGC。
解决方案:
1.可缩小表查询的范围,减少内存中加载的数据量。
2.MRS最新版本Hadoop已经做了优化,HdfsLocatedFileStatus一个对象从10k已经优化到2k.
PS:如果有FullGC问题,怀疑是业务导致的(一般内存会短时间内上升),可通过监控获取到内存骤升的时间,往前推一段时间获取执行的sql,在这些sql中排查看有没有分区文件特别多的情况。
- 点赞
- 收藏
- 关注作者
评论(0)