Hive INSERT OVERWRITE LOCAL DIRECTORY无效

时间:2015-10-05 07:13:47

标签: hadoop hive hdfs cloudera

我正在使用Cloudera 5.3.3 Hive。

我正在尝试执行以下查询,

shell>pwd
/home
shell> mkdir test; chmod 777 test;
shell> ls -al
drwxrwxrwx   3 jai jai  4096 Oct  5 06:45 test  

 hive query>INSERT OVERWRITE LOCAL DIRECTORY '/home/test/test1' SELECT * FROM some_table;

当我从hive客户端执行时,它正常工作并在 / home / test 文件夹中创建输出文件,但是如果我从执行相同的文件,则它不会创建文件直线即可。

从运行Hive服务器2的计算机通过 beeline 连接到 Hive服务器2

我将beive作为 jai 用户从beeline连接起来。 文件夹/ home / test

相同的查询,如果我指向 / tmp 文件夹(其中test文件夹具有777权限),则工作正常。它将mapreduce输出复制到test1文件夹中,该文件夹具有以下权限并创建为hive用户。

shell>pwd
/tmp
shell> ls -al
drwxrwxrwx   5 jai jai 4096 Oct  5 06:40 test      

beeline as jai user>  INSERT OVERWRITE LOCAL DIRECTORY '/tmp/test/test1' SELECT * FROM some_table;

shell> cd test;
shell> ls -al
drwxr-xr-x   3 hive     hive     4096 Oct  5 06:37 test1

1 个答案:

答案 0 :(得分:0)

我认为观察到的行为可能与问题HIVE-11666有关。

  

当INSERT OVERWRITE LOCAL DIRECTORY时,Hive CLI写入本地主机。但Beeline写入HS2本地目录。对于从CLI迁移到Beeline的用户来说,这可能是一个很大的机会(原文如此)。

解决方法可能是将其导出到HDFS

INSERT OVERWRITE DIRECTORY 'hdfs://<cluster>/tmp/test/test1' SELECT * FROM some_table;

注意:不要忘记使用完全限定的路径(从hdfs//开始),因为它不会起作用(参见here

然后简单地得到它

hdfs dfs -get hdfs://<cluster>/tmp/test/test1/<file name>