HDFS(三)——用 Java 建立一个 HDFS 目录,HDFS 的权限的问题

1、导入 HDFS 所需 jar 包
把解压后的 hadoop 文件夹下的 common 目录中的 jar,和里面的 lib 包中全部的 jar,以及 hdfs 目录下的 jar,和里面的 lib 包中全部的 jar 都添加到项目的环境变量中。java
在这里插入图片描述

hdfs

2、编写测试代码
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,执行上面的单元测试。
而后咱们就会发现,在控制台爆出了以下异常信息:node

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,因此就没有权限建立目录。web

解决方案:apache

  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。微信

  1. 经过-D参数来设置当前操做的用户名
    这种方式的操做的本质和前一种方式是同样的,都是经过修改参数来实现。svg

代码仍是原来的代码:oop

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,就能够拥有建立目录的权限。单元测试

  1. 改变目录的权限
    比方说咱们要在 /folder1目录下建立 /folder1/folder2只须要把 /folder1的目录权限设置为全部人可读,可写,可执行便可:chmod /folder1 777。测试

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

  1. 在 hdfs-site.xml 文件中配置禁用权限检查
    通常使用这种方式,在 hdfs-site.xml 配置文件中加入以下配置:
dfs.permissions false 参见:Hadoop的三种配置模式以及免密登陆。

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值