更新时间:2024-11-29 GMT+08:00

执行load data inpath命令报错

问题现象

执行load data inpath报如下错误:

  • 错误1:
    HiveAccessControlException Permission denied. Principal [name=user1, type=USER] does not have following privileges on Object [type=DFS_URI, name=hdfs://hacluster/tmp/input/mapdata] for operation LOAD : [OBJECT OWNERSHIP]
  • 错误2:
    HiveAccessControlException Permission denied. Principal [name=user1, type=USER] does not have following privileges on Object [type=DFS_URI, name=hdfs://hacluster/tmp/input/mapdata] for operation LOAD : [INSERT, DELETE]
  • 错误3:
    SemanticException [Error 10028]: Line 1:17 Path is not legal ''file:///tmp/input/mapdata'': Move from: file:/tmp/input/mapdata to: hdfs://hacluster/user/hive/warehouse/tmp1 is not valid. Please check that values for params "default.fs.name" and "hive.metastore.warehouse.dir" do not conflict.

原因分析

当前登录的用户不具备操作此目录的权限或者文件目录格式不正确。

解决方案

Hive对load data inpath命令有如下权限要求,请对照下述要求是否满足:
  • 文件的owner需要为执行命令的用户。
  • 当前用户需要对该文件有读、写权限。
  • 当前用户需要对该文件的目录有执行权限。
  • 由于load操作会将该文件移动到表对应的目录中,所以要求当前用户需要对表的对应目录有写权限。
  • 要求文件的格式与表指定的存储格式相同。如创建表时指定stored as rcfile,但是文件格式为txt,则不符合要求。
  • 文件必须是HDFS上的文件,不可以用file://的形式指定本地文件系统上的文件。
  • 文件名不能以下横线(_)或点(.)开头,以这些开头的文件会被忽略。

    如下所示,如果用户test_hive load数据,正确的权限如下:

    [root@192-168-1-18 duan]# hdfs dfs -ls /tmp/input2
    16/03/21 14:45:07 INFO hdfs.PeerCache: SocketCache disabled.
    Found 1 items
    -rw-r--r--   3 test_hive hive          6 2016-03-21 14:44 /tmp/input2/input.txt