运行作业时的Hadoop DFS权限问题

10

我遇到了以下权限错误,不确定为什么Hadoop正在尝试写入这个特定的文件夹:

hadoop jar /usr/lib/hadoop/hadoop-*-examples.jar pi 2 100000
Number of Maps  = 2
Samples per Map = 100000
Wrote input for Map #0
Wrote input for Map #1
Starting Job
org.apache.hadoop.security.AccessControlException: org.apache.hadoop.security.AccessControlException: Permission denied: user=myuser, access=WRITE, inode="/":hdfs:supergroup:drwxr-xr-x
有什么想法,为什么它正在尝试写入我的HDFS根目录?
更新:在临时设置hdfs根(/)为777权限后,我发现正在写一个“/tmp”文件夹。 我想一个选择是只需创建一个"/tmp"文件夹,允许所有人都有权限进行写入,但从安全的角度来看,最好将其写入用户文件夹中(即/user/myuser/tmp)。

3
尝试使用"hadoop fs -chmod"命令将"/"的权限设置为777,然后查看它写入了什么内容。 - Donald Miner
@orangeoctopus - 它正在写入 /tmp/hadoop-mapred -- 有没有更改此位置的设置? - Dolan Antenucci
@spike - 我更喜欢非root用户可以从自己的账户运行hadoop。我注意到它正在将/tmp写入hdfs,因此正在尝试弄清楚为什么会发生这种情况,如果你有任何想法,请告诉我。谢谢。 - Dolan Antenucci
当我们设置根目录,例如/app/hadoop/,它位于主节点上。这意味着所有数据都保存在主节点上吗? - Paschalis
@Paschalis - mapreduce.jobtracker.staging.root.dir 设置指向 HDFS 上的一个位置。 - Dolan Antenucci
显示剩余2条评论
4个回答

15

我通过以下设置成功实现了这个:

<configuration>
    <property>
        <name>mapreduce.jobtracker.staging.root.dir</name>
        <value>/user</value>
    </property>

    #...

</configuration>

需要重新启动jobtracker服务(特别感谢Hadoop邮件列表上的Jeff帮助我跟踪问题!)


嗯,看起来如果我设置了这个,mapred.system.dir(/hadoop/mapred/system)上的权限需要更宽松。 - stephen mulcahy
我已经将/mapred/system目录锁定为仅限mapred用户访问(mapred.system.dir=/mapred/system)。同时,hdfs根目录(/)也只设置了hdfs用户的访问权限。如果您仍然遇到问题,请告诉我您所遇到的错误信息。 - Dolan Antenucci
@dolan 我面临同样的权限问题,但我无法控制hdfs根目录。 但是查看/tmp目录,它有777权限。 所以我想知道这个问题是什么原因引起的。mapreduce.jobtracker.staging.root.dir = ${hadoop.tmp.dir}/mapred/staginghadoop.tmp.dir = /tmp/hadoop-${user.name}。也许它尝试在除了'/tmp'之外的hdfs根目录中写入其他目录?此外,我只看到这个错误对于大量输入路径; 对于较小的输入,它会顺利进行。感谢您的帮助。谢谢! - NPE
@sachin2182 -- 你能确认你可以在hdfs的/tmp目录下创建目录吗?如果可以,请为您的用户创建一个目录,然后尝试在配置中设置路径,使它们硬编码到您的新目录(也要创建所有子目录,例如mapred/staging)-- 将它们全部赋予777权限作为起始测试。重新启动Hadoop,然后查看是否仍然出现错误。您是否检查了/var/log/hadoop以查看它正在尝试写入哪里(不确定是否会告诉您,但值得一看)? - Dolan Antenucci
@dolan -- 我有权限在hdfs的/tmp目录下创建文件夹。结果,在解析我的输入时,出现了一些意外字符(用于确定输出位置),而map-reduce系统尝试写入根目录。我修复了我的脚本以处理意外字符,现在作业可以正常运行了。对于造成的困惑,我很抱歉,花了我一段时间才发现我的输入/脚本有问题。 - NPE
显示剩余4条评论

2

1)使用以下命令在HDFS中创建{mapred.system.dir}/mapred目录:

sudo -u hdfs hadoop fs -mkdir /hadoop/mapred/

2) 给mapred用户授权

sudo -u hdfs hadoop fs -chown mapred:hadoop /hadoop/mapred/

0

你也可以创建一个名为"hdfs"的新用户。这是一个相当简单的解决方案,但可能不够干净。

当然,这是在使用Cloudera Hadoop Manager(CDH3)的Hue时。


0
你需要设置Hadoop根目录(/)的权限,而不是设置系统根目录的权限。我也曾经感到困惑,但后来意识到所提到的目录是Hadoop文件系统的目录,而不是系统的目录。

当你说“hadoop根目录”时,是指HDFS的根目录吗?我选择不使HDFS根目录的权限宽松,以防止用户写入根目录(并强制他们进入一个特定目录——他们的“主目录”:/user/<username>)。 - Dolan Antenucci
没错。上述问题中的配置似乎是不正确的。它应该指向HDFS上的特定目录。在我的情况下,它指向了/opt/hadoop/mapred/local/staging。我给了该目录写入权限,然后它就正常工作了。 - divinedragon
你是说设置 mapreduce.jobtracker.staging.root.dir=/user 是不正确的吗?请注意,我在我的设置中还涉及到一个 HDFS 位置。另外,我正在使用 Cloudera,如果这有所不同的话。 - Dolan Antenucci

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