Hive任务执行中报栈内存溢出导致任务执行失败
问题背景与现象
Hive执行查询操作时报错Error running child : java.lang.StackOverflowError,具体报错信息如下:
FATAL [main] org.apache.hadoop.mapred.YarnChild: Error running child : java.lang.StackOverflowError at org.apache.hive.come.esotericsoftware.kryo.io.Input.readVarInt(Input.java:355) at org.apache.hive.come.esotericsoftware.kryo.util.DefautClassResolver.readName(DefautClassResolver.java:127) at org.apache.hive.come.esotericsoftware.kryo.util.DefautClassResolver.readClass(DefautClassResolver.java:115) at org.apache.hive.come.esotericsoftware.kryo.Kryo.readClass(Kryo.java.656) at org.apache.hive.come.esotericsoftware.kryo.kryo.readClassAnd0bject(Kryo.java:767) at org.apache.hive.come.esotericsoftware.kryo.serializers.collectionSerializer.read(CollectionSerializer.java:112)
原因分析
java.lang.StackOverflowError这是内存溢出错误的一种,即线程栈的溢出,方法调用层次过多(比如存在无限递归调用)或线程栈太小都会导致此报错。
解决办法
通过调整mapreduce阶段的map和reduce子进程JVM参数中的栈内存解决此问题,主要涉及参数为mapreduce.map.java.opts(调整map的栈内存)和mapreduce.reduce.java.opts(调整reduce的栈内存),调整方法如下(以mapreduce.map.java.opts参数为例)。
- 永久增加map内存mapreduce.map.memory.mb和mapreduce.map.java.opts的值:
- 进入Hive服务配置页面:
- MRS 3.x之前版本,单击集群名称,登录集群详情页面,选择“组件管理 > Hive > 服务配置”,单击“基础配置”下拉菜单,选择“全部配置”。
如果集群详情页面没有“组件管理”页签,请先完成IAM用户同步(在集群详情页的“概览”页签,单击“IAM用户同步”右侧的“同步”进行IAM用户同步)。
- MRS 3.x及后续版本,登录FusionInsight Manager,然后选择“集群 > 待操作的集群名称 > 服务 > Hive > 配置 > 全部配置”。
- MRS 3.x之前版本,单击集群名称,登录集群详情页面,选择“组件管理 > Hive > 服务配置”,单击“基础配置”下拉菜单,选择“全部配置”。
- 在hiveserver自定义参数界面添加自定义参数mapreduce.map.java.opts及相应的值。
- 保存配置并重启受影响的服务或者实例。
修改配置后需要保存,请注意参数在HiveServer自定义参数处修改,保存重启后生效(重启期间Hive服务不可用),请注意执行时间窗口。
- 进入Hive服务配置页面: