文档首页/ MapReduce服务 MRS/ 用户指南(巴黎区域)/ 故障排除/ 使用Hive/ 任务执行中报栈内存溢出导致任务执行失败
更新时间:2024-10-11 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参数为例)。

  • 临时增加map内存(只针对此次beeline生效):

    在beeline中执行如下命令set mapreduce.map.java.opts=-Xss8G;(具体数值请结合实际业务情况进行调整)。

  • 永久增加map内存mapreduce.map.memory.mb和mapreduce.map.java.opts的值:
    1. 进入Hive服务配置页面:
      • MRS 2.0.1之前版本,登录MRS Manager,选择“服务管理 > Hive > 服务配置”,单击“基础配置”下拉菜单,选择“全部配置”。
      • MRS 2.0.1及之后版本,在MRS控制台单击集群名称,选择“组件管理 > Hive > 服务配置”,单击“基础配置”下拉菜单,选择“全部配置”。

        若集群详情页面没有“组件管理”页签,请先完成IAM用户同步(在集群详情页的“概览”页签,单击“IAM用户同步”右侧的“同步”进行IAM用户同步)。

      • MRS 3.x及后续版本,登录FusionInsight Manager,然后选择“集群 > 待操作的集群名称 > 服务 > Hive > 配置 > 全部配置”。
    2. 在hiveserver自定义参数界面添加自定义参数mapreduce.map.java.opts及相应的值。
    3. 保存配置并重启受影响的服务或者实例。

      修改配置后需要保存,请注意参数在HiveServer自定义参数处修改,保存重启后生效(重启期间hive服务不可用),请注意执行时间窗口。