一、问题描述
使用hadoop的java api访问hdfs,读取hdfs上所有文件信息。但是因为没有访问权限,报错:
Exception in thread "main" org.apache.hadoop.security.AccessControlException: Permission denied: user=Lenovo, access=READ_EXECUTE, inode="/tmp/.cloudera_health_monitoring_canary_files":hdfs:supergroup:d---------
at org.apache.hadoop.hdfs.server.namenode.DefaultAuthorizationProvider.checkFsPermission(DefaultAuthorizationProvider.java:279)
at org.apache.hadoop.hdfs.server.namenode.DefaultAuthorizationProvider.check(DefaultAuthorizationProvider.java:260)
at org.apache.hadoop.hdfs.server.namenode.DefaultAuthorizationProvider.checkPermission(DefaultAuthorizationProvider.java:168)
at org.apache.hadoop.hdfs.server.namenode.FSPermissionChecker.checkPermission(FSPermissionChecker.java:152)
at org.apache.hadoop.hdfs.server.namenode.FSDirectory.checkPermission(FSDirectory.java:3885)
at org.apache.hadoop.hdfs.server.namenode.FSDirectory.checkPermission(FSDirectory.java:3868)
at org.apache.hadoop.hdfs.server.namenode.FSDirectory.checkPathAccess(FSDirectory.java:3839)
at org.apache.hadoop.hdfs.server.namenode.FSNamesystem.checkPathAccess(FSNamesystem.java:6793)
二、问题原因
HDFS文件系统的高级管理账户是hdfs,而对于客户端调试,默认使用账户名称是自己windows登陆账户的用户名。所以导致对hdfs上的文件目录没有访问权限。
三、解决方法
使客户端调试时,用户名命名为hdfs。解决办法,即为添加系统环境变量:HADOOP_USER_NAME=hdfs
1.添加系统环境变量
2.重启电脑,或者注销用户重新登录。这一步一定要做,否则配置不生效。
3.然后,重新调试程序,是可以以hdfs超级管理员权限访问hdfs上的所有文件夹!