java hdfs 指定用户目录_HDFS(三)——用 Java 创建一个 HDFS 目录,HDFS 的权限的问题...

本文介绍了在Java中使用HDFS时遇到的权限问题,详细讲解了如何通过设置HADOOP_USER_NAME环境变量或修改配置来以指定用户创建目录。同时,讨论了更改目录权限和禁用HDFS权限检查的方案,但警告了后者可能导致的安全风险。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、导入 HDFS 所需 jar 包

把解压后的 hadoop 文件夹下的 common 目录中的 jar,和里面的 lib 包中所有的 jar,以及 hdfs 目录下的 jar,和里面的 lib 包中所有的 jar 都添加到项目的环境变量中。

b9b4d9f403946b5c87d5ce2d8c95cfbf.png

二、编写测试代码

import org.apache.hadoop.conf.Configuration;

import org.apache.hadoop.fs.FileSystem;

import org.apache.hadoop.fs.Path;

import org.junit.Test;

/**

* @author 曲健磊

* @date 2018-11-24 23:20:45

*/

public class TestMkDir {

@Test

public void test1() throws Exception {

// 指定NameNode的地址

Configuration conf = new Configuration();

conf.set("fs.defaultFS", "hdfs://192.168.220.111:9000");

// 获取一个HDFS 客户端

FileSystem client = FileSystem.get(conf);

client.mkdirs(new Path("/folder1"));

// 关闭

client.close();

}

}

创建一个 Configuration 对象,并设置 NameNode 的地址。

根据 Configuration 对象获取一个 HDFS 客户端。

调用 mkdirs 方法,传入一个 Path 对象,参数为 “/folder1” 。

关闭客户端。

然后我们开启装有 hadoop 的虚拟机,执行 start-all.sh启动 HDFS 和 YARN,执行上面的单元测试。

然后我们就会发现,在控制台爆出了如下异常信息:

org.apache.hadoop.security.AccessControlException:

Permission denied: user=dell, access=WRITE,

inode="/folder1":root:supergroup:drwxr-xr-x

...

Caused by: org.apache.hadoop.ipc.RemoteException

(org.apache.hadoop.security.AccessControlException):

Permission denied: user=dell, access=WRITE,

inode="/folder1":root:supergroup:drwxr-xr-x

...

分析:可以看出是没有权限,我们要创建 /folder1目录,需要 WRITE(写)权限,只有 root 用户有写权限,组内成员和其他人只有读和执行这两个权限,而我们当前的用户又是 dell,所以就没有权限创建目录。

解决方案:

1. 通过代码的方式来设置当前用户名为 root

import org.apache.hadoop.conf.Configuration;

import org.apache.hadoop.fs.FileSystem;

import org.apache.hadoop.fs.Path;

import org.junit.Test;

/**

* @author 曲健磊

* @date 2018-11-24 23:20:45

*/

public class TestMkDir {

@Test

public void test1() throws Exception {

System.setProperty("HADOOP_USER_NAME", "root");

// 指定NameNode的地址

Configuration conf = new Configuration();

conf.set("fs.defaultFS", "hdfs://192.168.220.111:9000");

// 获取一个HDFS 客户端

FileSystem client = FileSystem.get(conf);

client.mkdirs(new Path("/folder1"));

// 关闭

client.close();

}

}

Hadoop 对权限的检查比较弱,你告诉它你叫啥,它就认为你叫啥,你告诉它你叫 root,它就认为你叫 root。

2. 通过-D参数来设置当前操作的用户名

这种方式的操作的本质和前一种方式是一样的,都是通过修改参数来实现。

代码还是原来的代码:

import org.apache.hadoop.conf.Configuration;

import org.apache.hadoop.fs.FileSystem;

import org.apache.hadoop.fs.Path;

import org.junit.Test;

/**

* @author 曲健磊

* @date 2018-11-24 23:20:45

*/

public class TestMkDir {

@Test

public void test1() throws Exception {

// 指定NameNode的地址

Configuration conf = new Configuration();

conf.set("fs.defaultFS", "hdfs://192.168.220.111:9000");

// 获取一个HDFS 客户端

FileSystem client = FileSystem.get(conf);

client.mkdirs(new Path("/folder1"));

// 关闭

client.close();

}

}

在执行代码的时候通过 -D 参数来指定 HADOOP_USER_NAME 为 root:

java -DHADOOP_USER_NAME root TestMkDir,这样在执行程序的时候,程序获取到的系统中的变量 HADOOP_USER_NAME 的值就是 root,当前用户 root,就可以拥有创建目录的权限。

3. 改变目录的权限

比方说我们要在 /folder1目录下创建 /folder1/folder2只需要把 /folder1的目录权限设置为所有人可读,可写,可执行即可:chmod /folder1 777。

缺点是:针对根目录就没有办法。

4. 在 hdfs-site.xml 文件中配置禁用权限检查

一般使用这种方式,在 hdfs-site.xml 配置文件中加入如下配置:

dfs.permissions

false

参见:Hadoop的三种配置模式以及免密登录。

再执行测试代码,hadoop 就不会执行权限检查了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值