最后一次:HDFS的permission denied

本文详细探讨了在使用Hadoop HDFS时遇到的权限问题,包括Windows和Linux环境下用户权限不足导致的异常。核心问题在于默认用户对HDFS目录无权限。解决方法是通过设置HADOOP_USER_NAME环境变量指定用户,如在Java代码中设置或在启动Spark前配置环境变量。然而,直接修改HDFS目录权限虽能临时解决问题,但会破坏权限控制。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在使用Hadoop HDFS时,几乎初学者都会遇到下面的权限问题,有的人草草搜索解决了,却不知道为什么,下次换一种场景依然解决不了。只有了解其本质原因,才能举一反三。

异常信息:
org.apache.hadoop.ipc.RemoteException(org.apache.hadoop.security.AccessControlException): Permission denied: user=administrator, access=WRITE, inode="/user/hdfs/xxx":hdfs:supergroup:drwxr-xr-x

几乎人人都知道这个报错是权限问题,发生这个错误的场景:

场景

  1. 在windows上,我通过IDEA使用Hadoop Client读取HDFS上的文件
  2. 在linux上,我使用非hdfs用户上传文件:hdfs dfs -put jimo.txt /usr/hdfs

显然,问题原因就是我们使用的用户对HDFS目录没有操作权限,我们使用的用户如果不指定,默认是系统用户:也就是当前登录用户,不论操作系统。

解决

那简单,切换成相应的hdfs用户吧。

linux完全ok,而windows要建一个用户就很麻烦了,所以,正确的方式Hadoop也考虑到了:手动指定用户!

通过设置 HADOOP_USER_NAME 这个环境变量来设置用户。

Java代码里

有的情况,你只需要设置一行代码即可,比如:

 System.setProperty("HADOOP_USER_NAME", hdfsUser);
 return FileSystem.get(new URI(hdfsPath), conf);

然后,有的情况是搞不定的。

当代码里设置不生效时

这种情况发生在Spark调用Hadoop上,当我们在本地(比如windows上)调试Spark程序时,设计到用spark读取hdfs,即便我们设置了HADOOP_USER_NAME, 他也不会生效,这时候就需要设置外部环境变量,不是在spark内部设置,而是启动spark程序之前就得设置。

一种方式是:设置系统级环境变量:直接在windows环境变量里配,或者linux下profile里配。

如果使用IDEA开发工具,可以很方便配置:
config

之后在开发调试时,我不想再看见这个异常,也希望不再看见。

不优美的解决方式

网上有的人直接修改目录权限:这里指的是HDFS集群上的目录权限

hdfs dfs -chmod -R 777 /user

虽然可以达到目的,但权限控制就没意义了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值