HiveServer2无响应分析

场景描述

我们在工作中有时候需要使用JDBC操作Hive,但最近经常出现每隔一段时间JDBC就超时没反应的情况。(这个问题和MetaStore内存溢出时的表现一模一样,关于MetaStore长时间没有响应的解决方案可以看我的另一篇文章中的第三个问题)

问题追溯

从以前的历史教训中,潜意识里第一个操作就是dump HiveServer2的内存模型,然后MAT去分析。但是因为初次发现此问题的时候为了生产环境尽快恢复,让运维去直接重启了,重新启动后的JVM去做dump没什么意义。而生产环境没有配置OOM时dump内存,所以就想了个笨方法:每天dump一次HiveServer2,直到发现OOM。

前天又发生一次,下图是MAT分析的当天的dump结果中的leak report


MAT内存泄漏分析

从这个图为线索去看HiveServer2的源码就可以找到问题的根源了。总体的类图如下

HiveServer高层类图

每个JDBC请求打开连接时,都是下面这个路径:把会话存储在SessionManager的全进程唯一实例里,而SessionManager与OperationManager又互相引用(这个对象也是全进程唯一的),每个会话里的每次操作都是通过OperationManager来存储的,Driver对象就在OperationManager内部的HashMap里。当JDBC客户端close的时候,把会话与会话的操作从HashMap里删除掉。

如果客户端的机器遇到极端情况(比如直接断电,然后重启服务)会不会出现内存溢出呢?答案是理论上不会,因为HiveServer2在启动的时候开启了一个线程,以固定的频率(默认是6小时)去检查超过固定时间无交互的会话(默认是7天),如果存在就直接关闭了。代码如下:


SessionManager类超时检查线程截图

为什么说理论上不会呢?我们考虑这个场景,HiveServer2内存假设1个G,每个会话需要内存100M,客户端需要长期维护5个会话,那么粗略计算,当前HiveServer2最多允许10个会话,当出现客户端断电又重连的情况,前一次运行中的会话未关闭,且未被定时线程清理(因为要等6小时触发一次,即使判断为需要清理也还要再等7天),再加上第二次启动的5个会话,内存就已经到OOM的边缘了,此时JVM一定在疯狂FullGC,客户端表现就是啥都干不了,最后超时了。

触发场景

原文

结合上面的分析,最容易想到引发这个问题的是什么场景呢?对,连接池。因为HiveServer2开发出来就是为了对外提供JDBC标准服务的,那么应用上使用连接池无可厚非啊。但很奇怪的是,我们自己的工程,因为使用场景的原因,对Hive的操作基本是不使用连接池的。所以我去找运维同事帮忙,把所有对HiveServer2的连接都抓出来,看看是哪些服务在使用。果然,是兄弟团队的应用程序,部署了11个实例,且使用了连接池配置MaxActive为30。

对方使用的连接池是Druid,粗略的看了下,这个连接池内部维护的队列,在连接被回收的时候,也是有一大堆逻辑去保证这个连接最大可能的recycle(这个是代码里的方法名字),放到一个队列里去循环利用,而不是真的去close了。所以,当连接不够用的时候,就申请,然后连接太多的时候也维护了30个连接,11个实例加一起,就会出现最初的问题了。其他的连接池是否会造成这个问题我没有时间去分析,就不再展开了。

2020年3月27日更新

我们找对方修改了代码配置,去掉了连接池。内存回收的情况稍有改善,但是仍然没有解决问题,一段时间后,HiveServer2再次内存溢出。再次看了一遍hive的odbc包与server包所有连接与关闭的代码,结合dump确认一定是有连接未关闭造成的。

索性netstat监控一直看,到底哪些IP的那些端口在长时间连接。抓了几小时后,发现确实还有长连接在连,找到对应的IP,去看对方端口属于哪个进程,最终确定是HUE。

找到运维说明情况,运维给搭建了一个新的HiveServer2实例,专供HUE查询使用,挂了就拉起来。准备再继续观察一段时间。

我用jmap 5分钟看一次 HiveServer2老年代内存占用,发现没有一直走高的趋势,都在周期性的占用释放,看来这个问题应该是解决了。(如果仍然没有解决,按照以前的经验3月31日前必会再次OOM,所以3月31日没有更新此文章,说明这个方法确定有效)

2020年3月26日 HiveServer2 老年代使用情况

解决方案

  1. JDBC操作Hive尽量不使用连接池,当然不要忘记close
  2. 在使用JDBC的场景里,必须提前预估好HiveServer2能提供的最大会话数量,毕竟会话与操作信息都是内存中的HashMap来存储的
  3. 缩短Session空闲超时判断的时间,对应的参数是hive.server2.idle.session.timeout 我们修改的值是一天的毫秒数

延伸问题

分享给同事的时候,有人问了一个问题,他有一个main函数启动了Java进程,没有Spring环境,自己创建了Driud的连接池然后获取DataSource,问不关闭DataSource就退出的话是不是会同样有问题。我认为是的,因为只要不关都要等7天才会被HiveServer强制退出。

DataSource接口描述了获取连接的行为,但关闭行为没有在这个接口里描述,我们在使用Druid这个连接池的时候获取到的是DruidDataSource类,它的关闭行为是从Closable接口中声明的。所以还是要记得强制转换对象类型为Closable,然后调用执行一下。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,530评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 86,403评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,120评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,770评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,758评论 5 367
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,649评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,021评论 3 398
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,675评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,931评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,659评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,751评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,410评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,004评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,969评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,203评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,042评论 2 350
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,493评论 2 343

推荐阅读更多精彩内容