权限被拒绝:在HDFS上

56

我是Hadoop分布式文件系统的新手,我已经在我的机器上完成了单节点Hadoop的完整安装。但是,在尝试上传数据到HDFS时,会出现权限被拒绝的错误消息Permission Denied

命令行终端显示的消息:

hduser@ubuntu:/usr/local/hadoop$ hadoop fs -put /usr/local/input-data/ /input
put: /usr/local/input-data (Permission denied)

hduser@ubuntu:/usr/local/hadoop$ 

使用 sudo 并将 hduser 添加到 sudouser 后:

hduser@ubuntu:/usr/local/hadoop$ sudo bin/hadoop fs -put /usr/local/input-data/ /inwe
put: org.apache.hadoop.security.AccessControlException: Permission denied: user=root, access=WRITE, inode="":hduser:supergroup:rwxr-xr-x

hduser@ubuntu:/usr/local/hadoop$ 

1
你是否有访问该目录的权限 - 你是否正在使用sudo? - ali haider
是的,在使用sudo之后,hduser@ubuntu:/usr/local/hadoop$ sudo bin/hadoop fs -put /usr/local/input-data/ /inwe 出现:org.apache.hadoop.security.AccessControlException: Permission denied: user=root, access=WRITE, inode="":hduser:supergroup:rwxr-xr-x hduser@ubuntu:/usr/local/hadoop$ - Vignesh Prajapati
在我的情况下,是因为我试图在文件系统中的一个位置下载文件,而我没有权限。 - optimist
6个回答

77

我通过禁用dfs权限暂时解决了这个问题。通过在conf/hdfs-site.xml中添加以下属性代码实现:

<property>
  <name>dfs.permissions</name>
  <value>false</value>
</property>

4
这是我在新群集中设置的第一件事情;-) - Thomas Decaux
conf文件夹在哪里? - Klas Mellbourn
1
conf文件夹是namenode的配置。在我的情况下,我使用homebrew安装了hadoop,但它位于/usr/local/Cellar/hadoop/2.7.3/libexec/etc/hadoop/hdfs-site.xml文件中。 - Anders Eriksson
7
这怎么可能是解决方案呢?它适用于测试,但不适用于生产。 - Alex Pollan
@KlasMellbourn [HADOOP_ROOT]/etc/hadoop - SRF
1
这个解决方案就像在WiFi不工作时插入以太网电缆一样 :) - Daniel Argüelles

56

我遇到了类似的情况,这是我的方法,有些不同:

 HADOOP_USER_NAME=hdfs hdfs dfs -put /root/MyHadoop/file1.txt /

您实际上要做的是根据您的本地权限读取本地文件,但在将文件放置在HDFS上时,您被认证为用户hdfs。您可以使用其他ID执行此操作(请注意真实身份验证方案的配置,但这通常不是问题)。

优点:

  1. 权限保留在HDFS上。
  2. 您不需要sudo
  3. 您实际上根本不需要适当的本地用户'hdfs'。
  4. 由于前面所述的原因,您无需复制任何内容或更改权限。

HADOOP_USER_NAME=你的用户 hdfs dfs -put /源路径 /目标路径 - mourad m
这不是一个解决方案,而是一个权宜之计。你基本上是在说:“我的用户没有权限?让我们使用超级用户”… - Itération 122442
对于2014年来说,这是一个完美的解决方案,即使现在它仍然有其目标听众。这显然是将您的HDFS用户与系统用户分离。是的,您拥有操作系统用户并不会在hdfs上给您带来任何东西。正如我所说,“其他身份验证方法”可以用于身份验证HSDP用户。只是那时没有人能做出除了周界安全之外的任何事情。把它想象成后端进程的服务帐户(通过API级别或其他方式进行实际用户身份验证)-在小型/中型公司中运作良好。 - Roman Nikitchenko

19

你在这里遇到了两个不同的问题:


hduser@ubuntu:/usr/local/hadoop$ hadoop fs -put /usr/local/input-data/ /input put: /usr/local/input-data (Permission denied)

这里,用户hduser无法访问本地目录/usr/local/input-data。也就是说,你的本地权限过于限制。你应该进行更改。

hduser@ubuntu:/usr/local/hadoop$ sudo bin/hadoop fs -put /usr/local/input-data/ /inwe put: org.apache.hadoop.security.AccessControlException: Permission denied: user=root, access=WRITE, inode="":hduser:supergroup:rwxr-xr-x

在这里,用户root(因为您正在使用sudo)无法访问HDFS目录/input。正如您所看到的:hduser:supergroup:rwxr-xr-x表明只有hduser具有写入权限。 Hadoop并不真正尊重root作为特殊用户。


为了解决此问题,我建议您更改本地数据的权限:

sudo chmod -R og+rx /usr/local/input-data/

然后,请以 hduser 的身份再次尝试运行 put 命令。


copyFromLocal: org.apache.hadoop.security.AccessControlException: 权限被拒绝:用户=root,访问=WRITE,inode="":hduser:supergroup:rwxr-xr-x。更改权限后出现上述错误提示。 - Vignesh Prajapati
2
不要使用“sudo”命令,而应该使用“hduser”用户来执行操作。 - Donald Miner
这是一个组权限问题,在@DonaldMiner的建议下通过chmod解决了。 - novato

6
我用以下步骤解决了这个问题。
su hdfs
hadoop fs -put /usr/local/input-data/ /input
exit

5

以root用户身份启动一个shell,然后切换到hduser用户并执行你的命令。

sudo -u hduser bash
hadoop fs -put /usr/local/input-data/ /input

[更新] 同时请注意,hdfs用户是超级用户,具有所有读写权限。

1
不需要启动 shell。sudo -u hdfs hadoop fs -chmod 777 /hbase同样有效。 - 030
好的,我假设你想要以hduser身份运行多个命令。 - Martin Tapp

4

对于Hadoop 3.x,如果您在未经身份验证的情况下(例如user=dr.who)尝试在HDFS上创建文件,则会出现此错误。

虽然不建议对需要安全的系统这样做,但是如果你想完全禁用Hadoop 3中的文件权限,则需要更改hdfs-site.xml设置:

<property>
  <name>dfs.permissions.enabled</name>
  <value>false</value>
</property>

https://hadoop.apache.org/docs/stable/hadoop-project-dist/hadoop-hdfs/hdfs-default.xml


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