今天在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