訪問HDFS報錯:org.apache.hadoop.security.AccessControlException: Permission denied


import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.Path;

public class TestHDFS {
    public static void main(String[] args) throws Exception{
        Configuration conf = new Configuration();
        conf.set("fs.defaultFS", "hdfs://192.168.0.104:9000");
        FileSystem fs = FileSystem.get(conf);

        //存在的情況下會覆蓋之前的目錄
        boolean success = fs.mkdirs(new Path("/xiaol"));
        System.out.println(success);
    }
}

 

Exception in thread "main" org.apache.hadoop.security.AccessControlException: Permission denied: user=xiaol, access=WRITE, inode="/xiaol":root:supergroup:drwxr-xr-x

 

網上的方法:

  1.在hdfs的配置文件中,將dfs.permissions.enabled修改為False

  2.hadoop fs -chmod 777 /

我覺得這倆方法都是屎


hadoop在訪問hdfs的時候會進行權限認證,取用戶名的過程是這樣的:

讀取HADOOP_USER_NAME系統環境變量,如果不為空,那么拿它作username,如果為空

讀取HADOOP_USER_NAME這個java環境變量,如果為空

從com.sun.security.auth.NTUserPrincipal或者com.sun.security.auth.UnixPrincipal的實例獲取username。

如果以上嘗試都失敗,那么拋出異常LoginException("Can’t find user name")

 

解決方案:

import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.Path;
import java.util.Properties;

public class TestHDFS {
    public static void main(String[] args) throws Exception{
        Properties properties = System.getProperties();
        properties.setProperty("HADOOP_USER_NAME", "root");

        Configuration conf = new Configuration();
        conf.set("fs.defaultFS", "hdfs://192.168.0.104:9000");
        FileSystem fs = FileSystem.get(conf);

        //存在的情況下會覆蓋之前的目錄
        boolean success = fs.mkdirs(new Path("/xiaol"));
        System.out.println(success);
    }
}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM