Hadoop2——笔记3:使用Java进行操作HDFS

本文详细解析了在使用Hadoop HDFS时遇到的权限问题,包括如何解决因用户权限不足导致的操作失败,以及如何正确配置Hadoop以允许跨平台文件操作。通过调整系统管理员名称、修改Hadoop配置和文件权限,确保Eclipse能够顺利地对Hadoop集群的HDFS进行文件的创建、删除和修改。

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

打开eclipse新建一个Java项目

进行导包

1.公共包

2.公共包的依赖包,lib下面所有

3.hdfs包

然后

然后回到虚拟机的master随便创建一个文件并放入到hdfs里

hadoop fs -put ./hello.txt /

然后再eclipse中读出来

然后创建文件

boolean success = fileSystem.mkdirs(new Path("/javaTest"));

System.out.println(success);

这里可能会报错

原因:

当执行创建文件的的时候,

即:

String Path = "hdfs://host2:9000";

FileSystem fileSystem = FileSystem.get(new URI(Path),new Configuration());

String DIR_PATH = "hdfs://host2:9000/user/hadoop/ok";

fileSystem.mkdirs(new Path(DIR_PATH));//想hadoop上创建一个文件报错

报错:

 org.apache.hadoop.security.AccessControlException:Permission denied:user=Administrator,access=WRITE,inode="tmp":root:supergroup:rwxr-xr-x 

 

原因:

1. 当前用户是Administrator ,不是hadoop用户

2. hadoop的默认的hdfs的文件目录是有权限的,要创建位置是目录是用文件权限的

    说明 :

           上面的String  IR_PATH_1 = "hdfs://host2:9000/user/hadoop/ok"; String   IR_PATH_2 = "/ok"; 

             这个这两个是有区别的,前面的 IR_PATH_1  是要在默认的目录(hdfs://host2:9000)下的/user/hadoop下进行创建文件夹,

     而他的文件为:drwxr-xr-x   - hadoop supergroup          0 2016-07-18 09:04 /user/hadoo    是用户用户hadoop 用户组supergroup 的文件夹

            后面的一个IR_PATH_2 是在根目录(hdfs://host2:9000)下进创建进行创建

 

 

解决办法:

1. 为了使Eclipse能正常对Hadoop集群的HDFS上的文件能进行修改和删除,所以修改你工作时所用的Win7系统管理员名字,默认一般为"Administrator",把它修改为"hadoop",此用户名与Hadoop集群普通用户一致,大家应该记得我们Hadoop集群中所有的机器都有一个普通用户——hadoop,而且Hadoop运行也是用这个用户进行的。为了不至于为权限苦恼,我们可以修改Win7上系统管理员的姓名,这样就避免出现该用户在Hadoop集群上没有权限等都疼问题,会导致在Eclipse中对Hadoop集群的HDFS创建和删除文件受影响。

(1)选择"本地用户和组",展开"用户",找到系统管理员"Administrator",修改其为"hadoop",
(2)把电脑进行"注销"或者"重启电脑",这样才能使管理员才能用这个名字。

 

2.修改hadoop的配置

在conf/hdfs-site.xml中加入

<property>
<name>dfs.permissions</name>
<value>false</value>
</property>

3.修改权限:(windows用户Administrator对hadoop目录并没有写入权限)

放开 hadoop 目录的权限 , 命令如下 :$ hadoop fs -chmod 777 /user/hadoop.

 这样是可以进行写入了,但是,这样创建的文件夹信息为:用户为 Administrator

drwxr-xr-x   - Administrator supergroup          0 2016-07-18 09:12 /user/hadoop/ok

是Administrator用户的,不是下面的一个文件夹类型一样

drwxr-xr-x - hadoop supergroup 0 2016-07-18 09:20 /user/hadoop/.Trash

这里我使用的方法是:

cd /usr/local/hadoop/etc/hadoop
vim hdfs-site.xml

然后重启集群,java程序再跑一遍,就成功了。  

        //判断hello.txt文件是否存在   
        boolean b = fileSystem.exists(new Path("/hello.txt"));
        System.out.println(b);
        
        //创建javaTest目录
        boolean success = fileSystem.mkdirs(new Path("/javaTest"));
        System.out.println(success);
        
        //删除javaTest目录
        boolean success = fileSystem.delete(new Path("/javaTest"), true);
        System.out.println(success);
        
        //判断javaTest目录是否存在   
        boolean b = fileSystem.exists(new Path("/javaTest"));
        System.out.println(b);

        //把win下的文件上传到HDFS上
        //在hdfs上创建一个文件
        FSDataOutputStream out = fileSystem.create(new Path("/test.data"), true);
        //选中本地文件
        FileInputStream fis = new FileInputStream("e:/test/ciyun.txt");
        //把fis中的文件拷贝到out中,缓冲区大小为4096,上传后关闭管道
        IOUtils.copyBytes(fis, out, 4096, true);
        

查看数据内容

//得到整个目录的信息
        FileStatus[] statuses = fileSystem.listStatus(new Path("/"));
        //System.out.println(statuses.length);
        for(FileStatus status : statuses) {
            System.out.println(status.getPath());
            System.out.println(status.getPermission());
            System.out.println(status.getReplication());
        }

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值