问题描述
主要报错信息
Exception in thread "main" org.apache.hadoop.security.AccessControlException: Permission denied: user=Administrator, access=WRITE, inode="/user/out1/_temporary/0":root:supergroup:drwxr-xr-x
at org.apache.hadoop.hdfs.server.namenode.FSPermissionChecker.check(FSPermissionChecker.java:319)
at org.apache.hadoop.hdfs.server.namenode.FSPermissionChecker.check(FSPermissionChecker.java:292)
at org.apache.hadoop.hdfs.server.namenode.FSPermissionChecker.checkPermission(FSPermissionChecker.java:213)
原因分析:
因为报错日志中有Permission denied: user=Administrator,所以应该是程序认为我们当前是Administrator用户,究其原因还是权限问题吗,操作hdfs的用户不是集群上规定的用户,而且不存在 supergroup组内
如图:操作hdfs的用户必须在超级组内
解决方案:
解决方案 有很多种,这里列举一下常见解决方法:
1.在代码里添加
System.setProperty(“HADOOP_USER_NAME”,“root”)
或者idea的 VM 添加
-DHADOOP_USER_NAME=hadoop
如果你用的是spark那你可以不用改代码,直接在提交参数做文章
spark-submit \
--driver-java-options '-DHADOOP_USER_NAME=root' \
2.默认情况下HDFS的文件是755,我们可以手动的将你要上传的那个目录权限改为777
(ps:简单粗暴,但是不建议)
hadoop fs -chmod 777 这里填你要改的HDFS文件路径.
3.右击计算机–>管理—>用户和组–>admin, 改为与Linux下集群主机名相同。
4.将用户添加到supergroup
组内
1、在Linux执行如下命令增加supergroup
sudo groupadd supergroup
2、将用户增加到supergroup中
sudo usermod -a -G supergroup root
3、同步系统的权限信息到HDFS文件系统
hdfs dfsadmin -refreshUserToGroupsMappings
4、查看属于supergroup用户组的用户
grep 'supergroup:' /etc/group