Apache Pig 权限问题

7

我试图在我的Hadoop集群上安装并运行Apache Pig,但遇到了权限问题。Pig本身启动并成功连接到集群-从Pig shell中,我可以通过ls访问和查看我的HDFS目录。但是,当我尝试加载数据和运行Pig命令时,我遇到了与权限相关的错误:

grunt> A = load 'all_annotated.txt' USING PigStorage() AS (id:long, text:chararray, lang:chararray);
grunt> DUMP A;
2011-08-24 18:11:40,961 [main] ERROR org.apache.pig.tools.grunt.Grunt - You don't have permission to perform the operation. Error from the server: org.apache.hadoop.security.AccessControlException: Permission denied: user=steven, access=WRITE, inode="":hadoop:supergroup:r-xr-xr-x
2011-08-24 18:11:40,977 [main] ERROR org.apache.pig.tools.grunt.Grunt - ERROR 1066: Unable to open iterator for alias A
Details at logfile: /Users/steven/Desktop/Hacking/hadoop/pig/pig-0.9.0/pig_1314230681326.log
grunt> 

在这种情况下,all_annotated.txt是我在HDFS主目录中创建的文件,并且我绝对有权限;无论我尝试load哪个文件,都会出现同样的问题。然而,我不认为这是问题所在,因为错误本身表明Pig正在尝试写入某个地方。通过谷歌搜索,我找到了一些邮件列表文章,建议某些Pig Latin语句(order等)需要对HDFS文件系统上的临时目录具有写访问权限,其位置由hdfsd-site.xml中的hadoop.tmp.dir属性控制。我不认为load属于该类别,但为了确保,我将hadoop.tmp.dir更改为指向我的HDFS主目录中的一个目录,但问题仍然存在。

那么,有没有人有任何想法是怎么回事?


对于那些在查找"ERROR 1066: Unable to open iterator for alias"时阅读到了这篇文章的人,这里提供一个通用解决方案 - Dennis Jaheruddin
2个回答

13

可能是由于你的pig.temp.dir设置导致的。它默认为HDFS上的/tmp,Pig将在那里写入临时结果。如果你没有/tmp的权限,Pig会报错。尝试通过使用-Dpig.temp.dir覆盖它。


1
好的,搞定了!我没意识到Pig有自己的tmp目录。非常感谢! - Steven Bedrick

0
一个问题可能是hadoop.tmp.dir是你本地文件系统上的目录,而不是HDFS。尝试将该属性设置为你知道自己具有写访问权限的本地目录。我在使用Hadoop中的常规MapReduce时遇到了相同的错误。

嗯,那样的话,错误就更没有意义了。我肯定在本地文件系统上有/tmp的写入权限。为了确保,我把它改回来了,但问题仍然存在。我真的认为无论如何都与HDFS有关。不过还是谢谢你的建议... - Steven Bedrick
2
inode="":hadoop:supergroup:r-xr-xr-x 的意思是用户 hadoop 正在尝试写入 HDFS 目录 /。请尝试使用 hadoop fs -chmod 755 / 命令,该命令将为 hadoop 用户添加写入权限。如果您不是以 hadoop 身份执行但属于 supergroup 组,则可能需要使用 775 权限。 - Matt D
谢谢回复!实际上我没有“/”目录的权限;我不是使用集群的管理员,所以我认为我无法在文件系统的那个级别上进行任何chmod操作。你知道Pig为什么会尝试写入HDFS根目录吗? - Steven Bedrick
1
根据丹尼尔的回答,看起来它试图在HDFS中创建目录/tmp,因此它需要写入/以创建该目录。 - Matt D

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接