hive mapreduce任务启动mapjoin失败,return code 3
hive mapreduce任务启动mapjoin失败,return code 3
- 设置hive的自动加载小表大小
- 出现问题
- 调整map任务内存
- 远程dubug
- 源码
- 问题解决
PS:解决方法只针对问题Hive Runtime Error: Map local work exhausted memroy,内存耗尽的错误。
前面说的都是解决问题过程,可自行跳过,解决方法在最后。
之前处理过的一个需求,有一批url需要撞库,url文件大小在50M左右,而需要撞库的表数据量比较大,所以考虑用mapjoin将小表放到内存中,避免reduce,提高速度,然而在启用的时候遇到了许多问题这里记录一下。
设置hive的自动加载小表大小
参数如下:
set hive.auto.convert.join=true; //设置自动选择MapJoin,默认是true
set hive.mapjoin.smalltable.filesize=1000000000; //设置mapjoin小表的文件大小为100M
默认值是25M,需改成100M之后就可以将本次的需求文件自动加载到内存进行mapjoin。
出现问题
根据问题提示的日志文件找到了以下描述:
Hive Runtime Error: Map local work exhausted memroy
说是内存不够了,好,那就加map任务内存呗。
调整map任务内存
set mapreduce.map.memory.mb=4096; //调整map task内存(map替换为reduce就是reduce)
然而调整之后上图中的max memory并没有任何变化,然后继续找
发现还有一个map任务的jvm内存参数,如下:
set mapred.child.java.opts=-Xmx1024mset mapreduce.map.java.opts=-Xmx2048m
set mapreduce.reduce.java.opts=-Xmx2048mset mapred.map.child.java.opts=-Xmx2048m
set mapred.reduce.child.java.opts=-Xmx2048m
上述三组参数,都是百度查到的,效果应该都是一样的,只不过因为hive的更新,导致设置参数的语句也在变化,有些语句设置在不同的版本可能会报错(没有深究,如有错误请指正),所以就都试一下吧。不过对这个问题来说,他们都没用,因为不管怎么设置,map memory参数还是没有变。
虽然问题没解决,不过倒是对这些内存了解了一下:
首先常用的几个内存:container的内存,task内存,task的jvm内存,jvm的堆内存。
container的内存默认为最大为8g,实际大小通过运行时指定的map或reduce内存来确定,然后是jvm的两个内存。关系应该是:
container内存 = map内存 = jvm内存> jvm堆内存
这些内存只是顺带提一嘴哈,当时百度的太多了,记不太清了。
远程dubug
既然上面那些内存都不是,那就只能debug来看一下调用的是哪个内存了,结果没想到hive debug也是这么坑,首先按网上说的,hive进调试模式,并打印控制台日志。
hive --debug --hiveconf hive.root.logger=DEBUG,console
然后idea建立远程连接,开始都很顺利,然后复现mapjoin的时候失败了,提示不能同时启动两个jvm,然后就在这卡了两天,各种百度,改启动文件,看源码,发现问题是,hive运行时首先会启动一个cli的jar包,就是交互界面的,然后跑mapreduce任务时候会再启动一个exec-driver的jar包,简单的select * 不会触发这个启动,但是稍微复杂一点启动job的话就会启动第二jar包,但这这两个jar包都是通过hadoop jar命令来启动的,启动时参数一样,所以导致任务失败。
我的解决办法是启动了hive cli之后,即进入hive交互界面之后,修改hadoop 的bin目录下hadoop启动脚本,
注释掉下面这一行:
HADOOP_OPTS="$HADOOP_OPTS $HADOOP_CLIENT_OPTS"
具体的原理我也没搞很明白,毕竟在这折腾了两天,整个人都废了,各种百度,东拼西凑的解决方法,就先这么用吧。
这样启动在运行sql语句后会提示在8000端口监听连接,然后再用idea启动一个远程连接就可以继续执行了。
源码
作为一名半吊子程序员,源码也是没搞太懂,不过按照错误日志给出的报错堆栈调用:
找到了MapRedLocalTask类,查找内存相关的参数时,看到了这么一段代码:
大概意思好像是说:本地任务运行时,jvm参数是无效的,默认读取parent jvm的参数,看到这里想了一下,难道这个parent jvm是运行hive cli的jvm?然后继续百度,hive在启动时果然是可以设置jvm的大小的。
问题解决
总结,mapjoin任务启动的是本地任务,而配置map内存或者jvm内存对本地任务是无效的,需要配置hive的启动jvm内存,方法有好几种:
一种是配置 hadoop-env.sh 具体参数名字忘记了,不过搜索一下“-Xmx”就能找到,里面没几个jvm的参数配置,默认的好像是512M,可以自己按需要修改
第二种修改hive-env配置文件,我没试这个,可以参考这篇文章:
https://www.cnblogs.com/jiangxiaoxian/p/6377471.html
第三种,最简单的方式,在启动hive客户端之前,修改一下变量
export HADOOP_CLIENT_OPTS="-Xmx1024m"
自己按需要修改大小就行,然后启动hive
问题解决!
最后提一点:语句中含有group by时会占用更多的内存,我的小表大小是50M,但是之前256M的内存都会报内存耗尽的错误,所以如果含有group by的话还是稍微调大一些。
hive mapreduce任务启动mapjoin失败,return code 3相关推荐
- hive遇到FAILED: Execution Error, return code 2 from org.apache.hadoop.hive.ql.exec.mr.MapRedTask错误...
hive遇到FAILED: Execution Error, return code 2 from org.apache.hadoop.hive.ql.exec.mr.MapRedTask错误 起因 ...
- hive报错Execution Error, return code 2 from org.apache.hadoop.hive.ql.exec.mr.MapRedTask
hive出现报错 Error: Error while processing statement: FAILED: Execution Error, return code 2 from org.ap ...
- Hive错误之 Execution Error, return code 2 from org.apache.hadoop.hive.ql.exec.mr.MapRedTask错误分析
Hive Execution Error, return code 2 from org.apache.hadoop.hive.ql.exec.mr.MapRedTask错误分析 1. 背景 使用hi ...
- Hive 插入数据时遇到Return Code 2问题的解决
正常情况下,估计很难遇到这个问题. 但是也刚好都碰上了这样的问题.于是把解决过程记录一下. Hive运行成功之后,当输入select count(*) from XX或者插入数据时,居然碰到BUG. ...
- Hive查询报错,return code 1 from org.apache.hadoop.hive.ql.exec.mr.MapRedTask
跑代码执行Hive查询,报错如下: StatementCallback; Error while processing statement: FAILED: Execution Error, retu ...
- 错误解决:hive报错Execution Error, return code 2 from org.apache.hadoop.hive.ql.exec.mr.MapRedTask
临时生效: # 开启本地模式,并执行查询语句 set hive.exec.mode.local.auto=true; 永久生效: <property><name>hive.ex ...
- 报错:FAILED: Execution Error, return code 2 from org.apache.hadoop.hive.ql.exec.mr.MapRedTask原因查找
项目场景: 使用hive分析.处理数据时 问题描述 执行hive语句后,报错:FAILED: Execution Error, return code 2 from org.apache.hadoop ...
- hive创建永久函数失败,Failed to register youmeng.finderrorcount using class com.jinghang.hive.MyCoustom
hive报错信息: 创建永久函数报错 Failed to register youmeng.finderrorcount using class com.jinghang.hive.MyCoustom ...
- Hive报错:Execution Error, return code 2 from org.apache.hadoop.hive.ql.exec.mr.MapRedTask MapReduce
最近在做hive练习题时使用hive查询报错 Hadoop job information for Stage-3: number of mappers: 0; number of reducers: ...
最新文章
- 使用OleDb,将Excel导入DataSet
- 简单聊聊AspNetCore的启动流程
- Redis整合springboot实现消息队列
- 数据湖,当然得要全闪存的!
- 微信 小程序 python 渲染_干货 | 微信小程序自动化测试最佳实践(附 Python 源码)...
- HTML hidden 属性
- gnuradio上怎么使用python文件_使用Python下载文件的简单示例
- 【原创】大叔案例分享(4)定位分析--见证scala的强大
- BZOJ2190 [SDOI2008]仪仗队
- 游戏启动是html,陈书艺:推动游戏前行 开启HTML5游戏之门
- 权重计算(1)——客观赋权法
- python参考文献及其出版社_金融工程及其Python应用(高等院校财政金融专业应用型教材) 正版 朱顺泉 9787302510758_朱顺泉_孔夫子旧书网...
- 苹果手机连接Wifi认证机制
- axio基础配置方法
- Win11-GTX3060-配置Pytorch GPU
- 阿里云服务器被挖矿的解决方法
- (附超声射频数据)matlab实现b超原始信号数据生成图像
- MySQL-基础练习题1
- 世界环境保护日的志愿者
- 软件企业税收优惠政策2023