HDFS客户端增删改查操作

本文介绍如何使用HDFS API进行文件操作,包括上传、下载、创建目录等,并演示了通过流方式实现更底层的文件交互。

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

方式1:

        API操作文件的增删改查

        

                  构造一个配置参数对象,设置一个参数:给出要访问的hdfsURI

                   // 从而FileSystem.get()方法就知道应该是去构造一个访问hdfs文件系统的客户端,以及hdfs的访问地址

                   // newConfiguration();的时候,它就会去加载jar包中的hdfs-default.xml

                   // 然后再加载classpath下的hdfs-site.xml(可以从集群中拷贝一份,直接放到classpath下)

                   Configurationconf = new Configuration();

                   conf.set("fs.defaultFS","hdfs://hdp-node01:9000");

                  conf.set("dfs.replication","3");

                   // 获取一个hdfs的访问客户端,根据参数,这个实例应该是DistributedFileSystem的实例

                   // fs =FileSystem.get(conf);


                   /**

                    * 参数优先级: 1、客户端代码中设置的值 2classpath下的用户自定义配置文件 3、然后是服务器的默认配置

                    */

             // 简写,就可以不要配"fs.defaultFS"参数,而且,这个客户端的身份标识已经是hadoop用户,其他参数还是设置在conf中

                  fs =FileSystem.get(new URI("hdfs://hdp-node01:9000"), conf,"hadoop");

—————————————————————————————————————————————

                上传文件:

                        fs.copyFromLocalFile(new Path(src), new Path(dst));

                下载文件:

                         fs.copyToLocalFile(new Path(src), new Path(dst));

                创建目录:

                       fs.mkdirs(newPath(""));

                删除文件夹:

                       fs.delete(newPath("/aaa"), true);  //如果是非空文件夹,参数2必须给值true

                 重命名文件或文件夹:

                   fs.rename(newPath("/a1"), new Path("/a2"))

                查看目录信息,只显示文件:

                        

public void testListFiles() throws FileNotFoundException,IllegalArgumentException, IOException {

                   RemoteIterator<LocatedFileStatus>listFiles = fs.listFiles(new Path("/"), true);

                   while(listFiles.hasNext()) {

                            LocatedFileStatusfileStatus = listFiles.next();

                            System.out.println(fileStatus.getPath().getName());

                            System.out.println(fileStatus.getBlockSize());

                            System.out.println(fileStatus.getPermission());

                            System.out.println(fileStatus.getLen());

                            BlockLocation[]blockLocations = fileStatus.getBlockLocations();

                            for(BlockLocation bl : blockLocations) {

                 System.out.println("block-length:"+ bl.getLength() + "--" + "block-offset:" +bl.getOffset());

                                     String[]hosts = bl.getHosts();

                                     for(String host : hosts) {

                                               System.out.println(host);

                                     }

                            }

                   }

         }

                    查看文件及文件夹信息:

                       

public void testListAll() throws FileNotFoundException,IllegalArgumentException, IOException {

                   FileStatus[]listStatus = fs.listStatus(new Path("/"));

                   Stringflag = "d--             ";

                   for(FileStatus fstatus : listStatus) {

                            if(fstatus.isFile())  flag = "f--         ";

                            System.out.println(flag+ fstatus.getPath().getName());

                   }

         }

 


方式2:

            通过流的方式访问HDFS,更底层的操作。

                 

                上传文件:

                    FSDataOutputStream outputStream = fs.create(new Path("/filename),true);

                   FileInputStreaminputStream = new FileInputStream("c:/filename1);

                   IOUtils.copy(inputStream,outputStream);

                下载文件:

                   FSDataInputStreamin = fs.open(new Path("/jdk-7u65-linux-i586.tar.gz"));

                   FileOutputStreamout = new FileOutputStream(new File("c:/jdk.tar.gz"));

                   IOUtils.copyBytes(in,out, 4096);

                查看文件内容:

                    FSDataInputStream in = fs.open(newPath("/filename));

                   IOUtils.copyBytes(in, System.out, 1024);

                在此过程可以随机定位,多个机器可以并发的所及读取HDFS文件指定位置的内容。

                   in.seek(22);//可以将流的起始偏移量进行自定义












评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值