更新时间:2024-11-29 GMT+08:00
任务执行中报栈内存溢出导致任务执行失败
问题背景与现象
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参数为例)。
父主题: 使用Hive