Open cjuexuan opened 5 years ago
Spark have this problem too, or
condition break partition pruing https://github.com/apache/spark/pull/24973
Hive会不会对一些比如分区查询之类的数据做缓存,我现在发现hivemetastore里查询缓存也挺占内存的
Hive会不会对一些比如分区查询之类的数据做缓存,我现在发现hivemetastore里查询缓存也挺占内存的
有缓存的 hive.metastore.aggregate.stats.cache.enabled
您好,是用什么方法查看对象的内存占用和生成hprof文件的?
使用jmap报"Unable to open socket file: target process not responding or HotSpot VM not loaded The -F option can be used when the target process is not responding"
,加上-F 似乎是按字读取的,速度太慢了。
遇到的问题是使用jdbc向Hive插入数据后,无法释放memHeapCommitted区域。
hive内存泄漏的罪魁祸首分析
在这周二的时候,下午6点半左右的时候收到了短信和邮件的报警,原因是hive的metastore的heap持续上升
我们第一次收到短信的时候大概是18:20,收到报警之后我们第一时间让运维重启了下那台有问题的节点,因为那天下午比较忙,也没再继续看了 过了一会儿,另一个metastore节点也开始报警了,这下就要慌了,要重视了,所以接下来我们开始梳理下我们的分析过程
heap分析
首先去spoor监控系统看了下heap的监控, hive的metastore产生了heap持续上升的报警的时间发生大的时间是在18点左右
此时我让运维用jmap看了下对象
看起来最大的是char[],我让他帮忙尝试看看能不能dump到heap,结果还真可以,所以我们可以用mat稍微再看下
从thread overview中我们看到了top的是hive的Partition相关的,当时我的第一直觉是有人查了一个大分区的表,那么当前最重要的就是找到是谁调用了哪个大分区的表
mysql slowLog分析
能搞这么大的分区的表,我想着mysql那边应该会有slowLog,由于从监控面板显示持续上涨最开始发生在18:00左右,于是让dba帮拉了一下那个时间点的slowLog 从Rows_sent中我们找到了那个具体的表了
其实现在回想,在stack里看到了
get_partitions_ps_with_auth
不分析mysql的slowlog也没有关系metastore的log分析
接下来问题变得简单了一点,我们去metastore查找了下那个时间点附近对于这个表的操作,找到了一个
get_partitions_ps_with_auth
,对应的ip指向了159这个节点调用源头分析
人总是先怀疑自己,我们首先查了下xql的driver ip为159,在那个时间点的对上面那张表的访问,是有对这个表的读取,然后肉眼分析了了下,看着好像都没啥问题,都带了分区条件。看起来线索就已经中断了
但是hive metastore的日志是不会有假,所以我们就登上了159那台主机,看那个时间点的container,然后通过container id找到yarn的application name,重新分析了下这个问题
通过application name的业务分析,此时又把矛头指向了我们xql,所以我们重新回过头看了下那个时间点的语句,以及结合他们sql的报错找到了那个有问题的语句,当时只是看他带了分区条件就迅速跳过了,也没细看
我们简化下用户sql
这里虽然写了分区字段,但是后面有or的条件,并且没用括号括起来,导致后面的or分区没有这个分区条件 嗯,还是写or不加括号的锅, 当然我们也找到了我们analzyer的一个bug