Hiveserver2 OOM问题解法

数据平台做一些计算需要通过hive jdbc方式连到hiveserver2执行job,但是hiveserver 正常运行一段时间后,总是会报如下OOM:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

Hive history file=/tmp/work/hive_job_log_ce580f37-05ff-4ca6-b4c8-bb4337e0ed47_1912327686.txt

Total MapReduce jobs = 1

Launching Job 1 out of 1

Number of reduce tasks not specified. Estimated from input data size: 1

In order to change the average load for a reducer (in bytes):

set hive.exec.reducers.bytes.per.reducer=<number>

In order to limit the maximum number of reducers:

set hive.exec.reducers.max=<number>

In order to set a constant number of reducers:

set mapred.reduce.tasks=<number>

java.lang.OutOfMemoryError: Java heap space

at org.apache.hadoop.hdfs.DFSOutputStream$Packet.<init>(DFSOutputStream.java:209)

at org.apache.hadoop.hdfs.DFSOutputStream.writeChunk(DFSOutputStream.java:1501)

at org.apache.hadoop.fs.FSOutputSummer.writeChecksumChunk(FSOutputSummer.java:173)

at org.apache.hadoop.fs.FSOutputSummer.write1(FSOutputSummer.java:116)

at org.apache.hadoop.fs.FSOutputSummer.write(FSOutputSummer.java:102)

at org.apache.hadoop.fs.FSDataOutputStream$PositionCache.write(FSDataOutputStream.java:54)

at java.io.DataOutputStream.write(DataOutputStream.java:107)

偶尔碰到未解决问题,重启HiveServer2,印证了那句老话,重启能解决80%以上的问题,但是好景不长,经过长期的观察,发现是HiveServer进程GC状况:

到这一步可以断定有资源没有释放, 再看下Heap对象分布:

看到这里我确实找不到招了,HashMap HashTable代码在Hive源码遍地都是,压根无法定位是哪个代码片段存在内存泄漏

然后我尝试去官网查下别人是否也碰到过同样的问题,果然在jira里搜索 “HiveServer2 OutOfMemoryError” ,存在一个Case跟我的情况一模一样,但Bug是Open状态,也就是还未解决!!  https://issues.apache.org/jira/browse/HIVE-9893

有问题就解决问题,考虑到HiveServer2是单点,对系统高可用、稳定性都会带来隐患;于是我想到了一个解决办法——开启多个HiveServer2,上层用Haprocxy来转发请求,再通过服务拨测实时对OOM的节点报警通知,以便研发能第一时间发现问题。但OOM依然存在,治标不治本。

这个Bug一直持续了将近半年,直到最近在调研Spark并计划将Spark取代Mapreduce来提升平台的计算效率时,发现Spark-sql能完美的兼容Hive SQL,同时还提供了ThriftServer(就是SparkHiveServer),不止于此,由于Spark更好的使用了内存,期执行效率是MR/Hive的10倍以上。

其实就是在Spark集群上执行$SPARK_HOME/sbin/start-thriftserver.sh –master=spark://MASTER:7077 就默认开启了10000端口,该服务可以取代hiveserver2,如果与HiveServer2在同一台服务器上,可以先shutdown hiveserver2,再启动spark thriftserver。运行了1个礼拜,服务非常稳定,GC也正常!

时间: 2024-11-08 17:27:32

Hiveserver2 OOM问题解法的相关文章

一个不简洁的约瑟夫环解法

约瑟夫环类似模型:已知有n个人,每次间隔k个人剔除一个,求最后一个剩余的. 此解法为变种,k最初为k-2,之后每次都加1. 例:n=5,k=3.从1开始,第一次间隔k-2=1,将3剔除,第二次间隔k-1=2,将1剔除.依此类推,直至剩余最后一个元素. 核心思路:将原列表复制多份横向展开,每次根据间隔获取被剔除的元素,同时将此元素存入一个剔除列表中.若被剔除元素不存在于剔除列表,则将其加入,若已存在,则顺势后移至从未加入剔除列表的元素,并将其加入.如此重复n-1次.面试遇到的题,当时只写了思路,没

斐波那契数列的递归和非递归解法

//递归解法 function fib(n){ if(n < 1){ throw new Error('invalid arguments'); } if(n == 1 || n == 2){ return 1; } return fib(n - 1) + fib(n - 2); } //非递归解法 function fib(n){ if(n < 1){ throw new Error('invalid arguments'); } if(n == 1 || n == 2){ return 1

HDU1013 POJ1519 Digital Roots(解法三)

该问题的最佳解法是利用数论的9余数定理来计算数根.一个数的数根等于该数的9的余数,若余数为0则结果为9. 问题链接:HDU1013 POJ1519 Digital Roots.入门练习题,用C语言编写程序. 问题简述:输入若干正整数,求其数根,直到输入为0为止. 问题分析:数根是指整数的各个位的数字之和.如果其和为1位整数,则为结果:如果其和为多位整数,则再将各位数字相加,直到其和为1位数为止.这个问题的大陷阱是,没有指出整数是多少位的.即使使用unsignde long long类型,也可能会

ViewPager做图片浏览器,加载大量图片OOM的问题修正

1 /** 2 * @author CHQ 3 * @version 1.0 4 * @date 创建时间: 2016/7/26 17:18 5 * @parameter 6 * @return 7 * 图片查看器 8 * //可以查看网络图片 9 * //可以查看本地图片 10 */ 11 public class PhotoScan extends Activity { 12 private PhotoViewPager mViewPager; 13 private List<View>

ACM/ICPC 之 四道MST-Prim解法(POJ1258-POJ1751-POJ2349-POJ3026)

四道MST,适合Prim解法,也可以作为MST练习题. 题意包括在代码中. POJ1258-Agri Net 水题 1 //Prim-没什么好说的 2 //接受一个邻接矩阵,求MST 3 //Time:0Ms Memory:220K 4 #include<iostream> 5 #include<cstring> 6 #include<cstdio> 7 #include<algorithm> 8 using namespace std; 9 #define

Android 防止OOM优化

1. Android2.x及以下的系统优化: Bitmap被解码后的像素被存储在Native Heap中, Dalvik Heap有个external计数,记录了Bitmap所占用的内存. 当 Dalvik Allocated + External Allocated + new Allocated>= 允许分配最大值时,就会引发OutOfMemoryError异常, 销毁的时候必须要调用recycle().BitmapFactory.Options参数,隐藏了inNativeAlloc属性,

hdu4521 小明系列问题——小明序列(LIS变种 (线段树+单点更新解法))

链接: huangjing 题目:中文题目 思路: 这个题目如果去掉那个距离大于d的条件,那么必然是一个普通的LIS,但是加上那个条件后就变得复杂了.用dp的解法没有看懂,我用的线段树的解法...就是采用延迟更新的做法,用为距离要大于d啊,所以我们在循环到第i的时候,就对(i-d-1)这个点进行更新,因为如果在(i-d-1)这个点更新了,会对后面的造成影响,然后线段树的tree[]数组存的是以i结尾的最长lis,那么每次询问的时候就找最大的tree[]就可以了... 代码: 小明系列问题--小明

由“Beeline连接HiveServer2后如何使用指定的队列(Yarn)运行Hive SQL语句”引发的一系列思考

背景 我们使用的HiveServer2的版本为0.13.1-cdh5.3.2,目前的任务使用Hive SQL构建,分为两种类型:手动任务(临时分析需求).调度任务(常规分析需求),两者均通过我们的Web系统进行提交.以前两种类型的任务都被提交至Yarn中一个名称为“hive”的队列,为了避免两种类型的任务之间相互受影响以及并行任务数过多导致“hive”队列资源紧张,我们在调度系统中构建了一个任务缓冲区队列,所有被提交的任务(手动任务.调度任务)并不会直接被提交至集群,而是提交至这个缓冲区队列中,

最近点对问题的解法

回到二维的情况.参考一维退化版本的解法,首先进行分解和求解步骤. 分解:将所有点按照横坐标从中心分成两部分. 求解:递归求解两半部分的最近点对,左右两半部分依次为 p_1,p_2p?1??,p?2?? 和 q_1,q_2q?1??,q?2??. 合并:令 d = min\{|p_1-p_2|, |q_1-q_2|\}d=min{∣p?1??−p?2??∣,∣q?1??−q?2??∣}.如下左图所示,除了两半部分各自的最近点对之外,只需要计算横跨图中左右两半部分区域的点对的距离最小值,再和 dd