今天在CDH上执行hive sql的时候报了一个错
错误内容为:
FAILED: Execution Error, return code 1 from org.apache.hadoop.hive.ql.exec.MoveTask
错误语句:
INSERT OVERWRITE DIRECTORY '{$dir}' select * from tmp_analyse_os where logdata='{$begin}'
错误原因:
hive源码会检查导出的路径是否存在,如果不存在则报这个错。这个错只有在CDH上的hive才会报错,apache已经修复了这个bug,其实CDH不是没有修复这个bug,而是添加了一个配置文件,但配置文件默认是false(蛋疼)。
解决方法:
在hive上添加一个配置即可。
<property>
<name>hive.insert.into.multilevel.dirs</name>
<value>true</value>
</property>
下面是源码中关于文件权限继承的开关代码:
HiveConf.ConfVars.HIVE_WAREHOUSE_SUBDIR_INHERIT_PERMS);
import org.apache.hadoop.hive.conf.HiveConf;
import org.apache.hadoop.hive.conf.HiveConf.ConfVars;
产生问题的原因:
hive的查询结果在在进行move操作时,需要进行文件权限的授权,多个文件的授权是并发进行的,hive中该源码是在一个线程池中
执行的,该操作在多线程时线程同步有问题的该异常,这是hive的一个bug,目前截止目前的最新版本Apache Hive 2.1.1还没有修复该问题;
可以通过关闭hive的文件权限继承 hive.warehouse.subdir.inherit.perms=false 来规避该问题。
解决方法:
hive.warehouse.subdir.inherit.perms
<property>
<name>hive.warehouse.subdir.inherit.perms</name>
<value>true</value>
<description>
Set this to false if the table directories should be created
with the permissions derived from dfs umask instead of
inheriting the permission of the warehouse or database directory.
</description>
</value>
return code 1
原因:
'Error while processing statement: FAILED: Execution Error, return code 1 from org.apache.hadoop.hive.ql.exec.MoveTask'
报错是抄的,多次实践证明,执行hive sql ERROR 返回 return code 1 基本上是执行的HQL无法加入到对应的用户队列中。
解决方法 1:
执行HQL前,加入 set MapReduce.queue = QUEUE_CRA; CRA(用户名)
解决方法 2:
hdfs dfs命令对文件夹下的文件赋予权限。使其可以进行操作。
return code 2:
原因 1:
HQL产生较大的笛卡尔积,撑爆了HIVE 执行的最大线程载荷。
解决方法:
优化HQL.
原因 2 :
Hive运行成功之后,当输入select count(*) from XX或者插入数据时,居然碰到BUG。
2016-04-14 12:31:56,199 Stage-1 map = 0%, reduce = 0%
Ended Job = job_1460599682683_0005 with errors
Error during job, obtaining debugging information...
FAILED: Execution Error, return code 2 fromorg.apache.hadoop.hive.ql.exec.mr.MapRedTask
MapReduce Jobs Launched:
Stage-Stage-1: HDFS Read: 0HDFS Write: 0 FAIL
Total MapReduce CPU Time Spent: 0 msec
这个问题只是HIVE单方面的问题,而用Hadoop Job日志查看,却是YarnException: Unauthorized request to start container的问题。未经授权的请求,怎么会有这样的问题呢。经过网上未解,说是各个节点的时间未同步的问题。
解决方法:
简直是晕,不知道谁刚好把某个节点时间修改了。才导致了这样的坑,居然都踩上了。于是把时间进行修改,进行系统时间同步,果然没有再次出现。
return code 3:
主要原因是数据倾斜。
解决方法 1: 对数据大的表进行GROUP BY ,减少数据量。
解决方法 2:
set hive.auto.convert.join = false;
•说明:是不是依据输入文件的大小,将Join转成普通的Map Join
•默认值: false
set hive.ignore.mapjoin.hint = false;
•说明: 是否忽略mapjoin hint 即mapjoin标记
•默认值: true
set hive.exec.parallel = true;
•说明:是否并行提交任务
•默认值:false