生产环境中java api访问HDFS权限问题Permission denied解决方案
java api访问hdfs文件系统未指定访问用户的情况下出现报错
//1、创建hadoop configuration对象 // Configuration conf = new Configuration(); Configuration conf = new Configuration(); conf.set("fs.defaultFS","hdfs://linux121:9000"); //2、创建hadoop FileSystem对象 // FileSystem fileSystem = FileSystem.get(new URI("hdfs://linux121:9000"), conf, "root"); FileSystem fileSystem = FileSystem.get(conf); //3、创建文件夹 fileSystem.mkdirs(new Path("/tp_user")); //4、关闭资源 fileSystem.close();
出现以下报错:
org.apache.hadoop.security.AccessControlException: Permission denied: user=QI, access=WRITE, inode="/":root:supergroup:drwxr-xr-x at org.apache.hadoop.hdfs.server.namenode.FSPermissionChecker.check(FSPermissionChecker.java:350) at org.apache.hadoop.hdfs.server.namenode.FSPermissionChecker.checkPermission(FSPermissionChecker.java:251) at org.apache.hadoop.hdfs.server.namenode.FSPermissionChecker.checkPermission(FSPermissionChecker.java:189) at org.apache.hadoop.hdfs.server.namenode.FSDirectory.checkPermission(FSDirectory.java:1753) at org.apache.hadoop.hdfs.server.namenode.FSDirectory.checkPermission(FSDirectory.java:1737) at org.apache.hadoop.hdfs.server.namenode.FSDirectory.checkAncestorAccess(FSDirectory.java:1696) at org.apache.hadoop.hdfs.server.namenode.FSDirMkdirOp.mkdirs(FSDirMkdirOp.java:60) at org.apache.hadoop.hdfs.server.namenode.FSNamesystem.mkdirs(FSNamesystem.java:2990) at org.apache.hadoop.hdfs.server.namenode.NameNodeRpcServer.mkdirs(NameNodeRpcServer.java:1096) at org.apache.hadoop.hdfs.protocolPB.ClientNamenodeProtocolServerSideTranslatorPB.mkdirs(ClientNamenodeProtocolServerSideTranslatorPB
在未指定访问名的情况下默认是使用当前系统用户名进行访问,会出现权限不够报错异常,hdfs用户访问权限比较鸡肋,不能防止坏人做坏事!!
在生产的情况下,有以下三种方案进行解决:
- 指定用户信息获取FileSystem对象 关闭HDFS集群权限校验
- 关闭HDFS集群权限校验
vim hdfs-site.xml #添加如下属性 <property> <name>dfs.permissions</name> <value>true</value> </property>
- 基于HDFS权限本身比较鸡肋的特点,我们可以彻底放弃HDFS的权限校验,如果生产环境中 我们可以考虑借助kerberos以及sentry等安全框架来管理大数据集群安全。所以我们直接修 改HDFS的根目录权限为777
hadoop fs -chmod -R 777 /