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的错误的主要内容,如果未能解决你的问题,请参考以下文章
hive on spark hql 插入数据报错 Failed to create Spark client for Spark session Error code 30041
hive on spark hql 插入数据报错 Failed to create Spark client for Spark session Error code 30041
hive 插入数据的时候,不能直接运行,报错FAILED: Execution Error, return code 2 from org.apache.hadoop.hive.ql.exec.mr.
hive 插入数据的时候,不能直接运行,报错FAILED: Execution Error, return code 2 from org.apache.hadoop.hive.ql.exec.mr.
Hive创建表格报Error, return code 1 from org.apache.hadoop.hive.ql.exec.DDLTask. MetaException引发的血案