Hive Execution Error, return code 2 from org.apache.hadoop.hive.ql.exec.mr.MapRedTask错误分析
1. 背景
- 使用hive过程中,遇到问题有时候信息不是很足够,这时候就需要去想办法查看错误信息。而这类服务器框架的错误信息一般都存放在日志中
- hive的日志不设置的话,默认存放在/tmp下当前用户所在目录,本文演示是root用户,所以文件存放在tmp文件夹下的root目录下/tmp/root
已经按照日期和时间进行存储,查看最新的日志文件信息即可
# 使用tail命令查看日志文件最后200行,日志都是追加,所以一般都是从尾部查看。 同时为了快速检索,可以查看error级别信息,时间信息也看一下,因为程序运行出错时间是可以确定地,根据这个可以去查看日志中对应时间的信息。
tail -200 hive.log
2. 原因汇总
2.1 没有开启hive的metastore服务
# 这是在hive shell客户端之外执行的,注意注意
hive --service metastore
2.2 集群中各个节点时间不同步导致
- 连接各个节点,输入date查看时间信息
date
- 安装日期同步工具
yum -y install ntp ntpdate
- 设置日期同步指令
ntpdate cn.pool.ntp.org
# 或者使用这一条指令
ntpdate -u ntp.api.bz
- 将系统时间写入硬件时间(主板中会有电池,这个电池耗尽之前,主板时间都会相对精准)
hwclock –w
# 设置后查看硬件时间
hwclock -show
2.3 执行hive shell指令的集群节点内存耗尽
- 如果在日志中看到是memoryOutOfUse等错误信息,再查看一下系统内存信息
# 主要查看剩余可用的内存,如果只有200到300Mb,很多时候就会报这个错误。
free -h
解决办法:
- 可以重新启动hive服务或者重新启动节点机器,这样内存可以被释放出来,
- 使用linux的内存释放方法
- 加内存条
- 使用yarn模式运行,不要使用local模式运行,这样单节点的内存消耗会慢很多
2.4 由于hadoop 3.2.1和hive 3.1.2不兼容
- 将hadoop 3.2.1适配的hive 3.1.1一起安装,不要安装hive 3.1.2.强行安装在一起会导致内存不回收的问题,本地模式执行一段时间后,内存就会被耗尽。最后导致hive转换的mapreduce程序因为内存耗尽而报错
3. 总结
- 很不幸,也很幸运,上述的坑我都踩过。耗费一整晚的时间进行定位和修复
- 幸运的是,问题原因都是查看日志和百度查看其他人博客解决,所以我也会将这些错误汇总出来,希望可以给大家一些帮助。