Apache Pig 权限问题
Posted
技术标签:
【中文标题】Apache Pig 权限问题【英文标题】:Apache Pig permissions issue 【发布时间】:2011-08-25 16:38:17 【问题描述】:我正在尝试在我的 Hadoop 集群上启动并运行 Apache Pig,但遇到了权限问题。 Pig 本身正在启动并很好地连接到集群——从 Pig shell 中,我可以通过我的 HDFS 目录和周围的ls
。但是,当我尝试实际加载数据并运行 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 正试图在某处 write。谷歌搜索,我发现一些邮件列表帖子表明某些 Pig Latin 语句(order
等)需要对 HDFS 文件系统上的临时目录的写入权限,该目录的位置由 hdfsd-site 中的hadoop.tmp.dir
属性控制.xml。我不认为 load
属于该类别,但为了确定,我将 hadoop.tmp.dir
更改为指向我的 HDFS 主目录中的一个目录,问题仍然存在。
那么,有人对可能发生的事情有任何想法吗?
【问题讨论】:
对于在寻找ERROR 1066: Unable to open iterator for alias 时发现此帖子的人,这里是generic solution。 【参考方案1】:可能是您的 pig.temp.dir 设置。它在 hdfs 上默认为 /tmp。 Pig 将在那里写入临时结果。如果你没有 /tmp 的权限,Pig 会抱怨。尝试通过 -Dpig.temp.dir 覆盖它。
【讨论】:
是的,做到了!我没有意识到 Pig 有自己的 tmp 目录。非常感谢!【参考方案2】:一个问题可能是hadoop.tmp.dir
是您本地文件系统上的一个目录,而不是 HDFS。尝试将该属性设置为您知道您具有写入权限的本地目录。我在 Hadoop 中使用常规 MapReduce 时遇到了同样的错误。
【讨论】:
嗯。好吧,在这种情况下,错误就更没有意义了。我绝对对我的本地文件系统上的 /tmp 有写访问权。只是为了确定,我把它改回来了,问题仍然存在。我真的认为无论发生什么都与 HDFS 相关。不过还是谢谢你的建议……inode="":hadoop:supergroup:r-xr-xr-x
表示用户hadoop
正在尝试写入HDFS 目录/
。试试hadoop fs -chmod 755 /
,它将为hadoop
用户添加写权限。如果您不是作为 hadoop 执行,而是在 supergroup
组中,则可能需要使用 775
。
感谢您的回复!我实际上没有“/”的权限;我不是我正在使用的集群的管理员,所以我认为我无法在文件系统的那个级别上对任何东西进行 chmod。你知道为什么 Pig 会尝试写入 HDFS 根目录吗?
根据 Daniel 的回答,它似乎试图在 HDFS 中创建目录 /tmp
,因此需要写入 /
来创建该目录。以上是关于Apache Pig 权限问题的主要内容,如果未能解决你的问题,请参考以下文章
权限被拒绝:user=basi,access=WRITE,inode="/":