hive查询或者插入数据报return code 2的错误
Posted 理财规划师-默读者
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了hive查询或者插入数据报return code 2的错误相关的知识,希望对你有一定的参考价值。
org.apache.hive.service.cli.HiveSQLException: Error while processing statement: FAILED: Execution Error, return code 2 from org.apache.hadoop.hive.ql.exec.mr.MapRedTask at org.apache.hive.service.cli.operation.Operation.toSQLException(Operation.java:380) at org.apache.hive.service.cli.operation.SQLOperation.runQuery(SQLOperation.java:257) at org.apache.hive.service.cli.operation.SQLOperation.access$800(SQLOperation.java:91) at org.apache.hive.service.cli.operation.SQLOperation$BackgroundWork$1.run(SQLOperation.java:348) at java.security.AccessController.doPrivileged(Native Method) at javax.security.auth.Subject.doAs(Subject.java:422) at org.apache.hadoop.security.UserGroupInformation.doAs(UserGroupInformation.java:1911) at
我相信这个问题会困扰大家很久
我摸索出一种解决方案。
设置执行引擎为spark
因为报错的时候,使用的引擎是mr,可以尝试设置tez或者spark引擎,我尝试过后,发现使用spark引擎有效果。
a、配置mapreduce计算引擎 set hive.execution.engine=mr; b、配置spark计算引擎 set hive.execution.engine=spark; c、配置tez 计算引擎 set hive.execution.engine=tez;
这样就可以查出数据来了。
上面解决了查询问题。如果是 insert overwrite/into table select * from tablename 这种的插入语句,该如何解决呢?
第一步、设置spark引擎
set hive.execution.engine=spark;
第二步、向临时表中插入数据
解释一下:因为选用了spark引擎,在插入数据以后,会产生许多小文件的问题。本次解决spark产生小文件的问题。
a、新建一个临时表,例如要插入表A中,那么创建一张与表A同构的表作为临时表,这里命名表A_tmp。这一步解决了return code 2的问题
第三步、设置mr引擎
set hive.execution.engine=mr;
将引擎从spark换回mr,这样是为了解决spark小文件的问题。
第四步、将临时表的数据插入到目标表中
第五步、删掉临时表中的数据
具体栗子:
--第一步、设置spark引擎
set hive.execution.engine=spark;
--第二步、向临时表中插入数据
insert overwrite table dw.A_tmp partition(dt = '${dt}')
select id ,name from ods.t_table
where dt = '${dt}'
;
--注意,这里的ods、dw指的是数据仓库的分层
--此时A_tmp表中有很多小文件,所以不应该在直接插入到目标表A中,应该在插入之前解决小文件问题
--第三步、设置mr引擎
set hive.execution.engine=mr;
--第四步、将临时表的数据插入到目标表中
insert overwrite table dw.A partition(dt = '${dt}')
select id ,name from dw.A_tmp
where dt = '${dt}'
;
--因为此时是mr引擎,所以当A_tmp表向目标表A插入数据时,会自动合并掉小文件到表A中,当然A_tmp表中还是有小文件的
--第五步、删掉临时表中的数据
alter table dw.A_tmp drop partition (dt ='${dt}');
--因为是临时表,是一个过渡的表,所以删掉或者清空分区中的数据,也就是清空了小文件,这样就减轻了hdfs系统的管理压力。
我在网上看到的一些观点:
以下拷贝其他作者的话语
使用hive做join查询,a表十几万数据,b表1kw多点数据,结果跑起来就是跑一半返回错误,提示如下:
FAILED: Execution Error, return code 2 from org.apache.hadoop.hive.ql.exec.mr.MapRedTask
尝试
- 实在是没什么解决办法,然后咨询了别人,说看看是不是有不合理数据,然后查了一下,去掉了一个空数据……然后重新跑,还是不行
- 谷歌上,看到这个网页,意思是这并不是真的错误,需要去看日志。然后同事去看了日志,没看到什么东西
- 再考虑是不是队列的事情,结果换了个队列,依然是同样的错误
解决
这个时候我真的开始怀疑是不是数据过大了……虽然理论上倒是不应该,然后同事说要不你试一下换个引擎,然后把引擎换成了Tez,你妈嗨,22s跑出来了结果……擦
这让我情何以堪?就换个引擎,你至于差别这么大么,Map-Reduce和Tez让我感觉实在是太吃惊了
所以再遇到这个问题,确认数据没问题,命令没问题的同学,可以试试这个办法。
感想
解决问题的思路,有时候卡住了可以换个思路,这条路堵住了,看看其他的办法
https://www.cnblogs.com/wswang/p/7718067.html
在这篇文章的启迪下,我摸索出这个办法来。
以上是关于hive查询或者插入数据报return code 2的错误的主要内容,如果未能解决你的问题,请参考以下文章