欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

hive程序报FAILED: Execution Error, return code 2 from org.apache.hadoop.hive.ql.exec.mr.MapRedTask

程序员文章站 2022-07-14 22:33:17
...
执行hive定时任务,发现有个定时任务报如下错误,Error: Java heap space.hive程序报FAILED: Execution Error, return code 2 from org.apache.hadoop.hive.ql.exec.mr.MapRedTask
    查询平台日志,显示mapreduce都已经执行成功了,脚本没有问题,没有报错,那就是平台问题了
    查看hadoop日志发现,实际上有4个map没有执行成功,而reduce就没有执行,说明调度平台显示的日志信息不准确。进入对应的4个map中查看日志,发现真实报内存溢出错误hive程序报FAILED: Execution Error, return code 2 from org.apache.hadoop.hive.ql.exec.mr.MapRedTask
        原来是有4个map出现内存溢出问题,上图查看实际使用值为1575879256≈1.47g,执行失败。这种情况我们分析,有可能是map的切片设置的太大,而系统给每个map可以分配的最大内存设置的太小,所有造成内存溢出。
        通过set hive.mapreduce.map.memory.mb;查看可知
         set hive.mapreduce.map.memory.mb=2048.所以每个map可以使用的内存完全够用。
       通过hive中查询,原来系统给堆内存设置的大小是1536Mb,即1.5G,而实际中执行切片设置的过大,造成计算该切片所需要的堆内存为1.47g,尽快比1.5g小,但是jvm本身就需要运行就需要内存以及其他消耗,造成堆内存溢出。
hive> set mapred.child.java.opts;
mapred.child.java.opts=-Xmx1536m -Xms1536m -Xmn256m -XX:SurvivorRatio=6 -XX:MaxPermSize=128m -XX:+PrintGCDetails 
-XX:+PrintGCTimeStamps -XX:+UseParNewGC -XX:+UseConcMarkSweepGC -XX:CMSInitiatingOccupancyFraction=80  -XX:GCTimeLimit=90 
-XX:GCHeapFreeLimit=10 -XX:ParallelGCThreads=8

        解决方式:1.将系统设置的set mapred.max.split.size = 300000000;我们原先的最大分片设置成200000000.降低切片大小,这样的坏处是会产生更多的map去执行。

       2.将上面集群的heap.size设置的更大些,比如2048(2g).设置方式如下:  

1.写到配置文件里,比如设置成2G
     <property>
        <name >mapred.child.java.opts</name>
        <value>-Xmx2048m </value>
     </property>
2.当然也可以直接配置,直接在查询出来的值中修改
任务启动的jvm参数,默认值-Xmx200m,建议值-XX:-UseGCOverheadLimit -Xms512m -Xmx2048m -verbose:gc -Xloggc:/tmp/@aaa@qq.com
可以直接修改

        当然以上的配置信息,最好都直接写到每个hive定时任务里面即可,不用配置到集群里固定信息,这样能更好地利用集群资源。