1. 程式人生 > 其它 >org.apache.hadoop.security.AccessControlException: Permission denied

org.apache.hadoop.security.AccessControlException: Permission denied

問題

訪問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.更改HDFS根目錄許可權

hadoop fs -chmod 777 /

3.新增訪問使用者

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);
    }
}

這其實是個漏洞,如果使用者使用root或者其他目錄的使用者名稱,就可以對相應的目錄進行任何操作,所以還是很危險的。