6.4 Java API 操作 HDFS 文件(三)

 

任务目的

  • 学会使用 Java API 删除指定的 HDFS 文件或目录
  • 学会使用 Java API 查看指定 HDFS 目录下所有文件信息和对应块信息

任务清单

  • 任务1:删除文件/目录
  • 任务2:查看指定路径中文件和块信息

详细任务步骤

任务1:删除文件/目录

  通过FileSystem.delete(Path f,Boolean recursive)可删除指定的 HDFS 文件或目录,其中 f 为需要删除文件或目录的完整路径,recursive 用来确定是否进行递归删除,若是删除文件则为 false,若是删除的是目录则为 True。具体实现如下:

package com.hongyaa.hdfs;

import java.io.IOException;
import java.net.URI;
import java.net.URISyntaxException;

import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.Path;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;

public class HDFSDemo {
	FileSystem fs = null;

	// 每次执行单元测试前都会执行该方法
	@Before
	public void setUp() throws IOException, InterruptedException, URISyntaxException {
		Configuration conf = new Configuration();
		// 不需要配置“fs.defaultFS”参数,直接传入URI和用户身份,最后一个参数是安装Hadoop集群的用户,我的是“root”
		fs = FileSystem.get(new URI("hdfs://localhost:9000"), conf, "root");
	}

    //单元方法:删除文件或者文件夹
    @Test
    public void deleteFileOrDir() throws IllegalArgumentException, IOException{
        //删除文件,第二参数:是否递归,若是文件或者空文件夹时可以为false,若是非空文件夹则需要为true
        fs.delete(new Path("/123/read.txt"),false);
        //删除文件夹
        fs.delete(new Path("/123/data"), true);
}

	// 每次执行单元测试后都会执行该方法,关闭资源
	@After
	public void tearDown() {
		if (null != fs) {
			try {
				fs.close();
			} catch (IOException e) {
				e.printStackTrace();
			}
		}
	}
}

  删除之前:

Vditor

图1

 

  删除之后,查看 HDFS 的 /123 目录,发现其下的 read.txt 文件和 data 目录都被删除成功:

Vditor

图2

 

任务2:查看指定路径中文件和块信息

  通过FileSystem.listFiles(Path f,Boolean recursive)可递归获取指定 HDFS 目录下的所有文件的绝对路径,其中 f 为指定路径,recursive 用来确定是否进行递归列出。具体实现如下:

import org.apache.hadoop.fs.BlockLocation;
import org.apache.hadoop.fs.LocatedFileStatus;
import org.apache.hadoop.fs.RemoteIterator;

    //单元方法:查看目录信息,只显示该目录下的文件信息
    @Test
    public void listFiles() throws FileNotFoundException, IllegalArgumentException, IOException{
        //使用迭代器递归获取该目录下的所有文件
        RemoteIterator<LocatedFileStatus> listfile=fs.listFiles(new Path("/123"), true);
        while(listfile.hasNext()){
            LocatedFileStatus fileStatus=listfile.next();
            System.out.println("文件路径:"+fileStatus.getPath());
            System.out.println("文件名称:"+fileStatus.getPath().getName());
            System.out.println("块的大小:"+fileStatus.getBlockSize());
            System.out.println("文件所有者:"+fileStatus.getOwner());
            System.out.println("文件所属组:"+fileStatus.getGroup());
            System.out.println("文件权限:"+fileStatus.getPermission());
            System.out.println("副本个数:"+fileStatus.getReplication());
            System.out.println("文件长度:"+fileStatus.getLen());
            System.out.println("-----块的信息-----");
            BlockLocation[] blockLocations=fileStatus.getBlockLocations();
            for(BlockLocation bLocation:blockLocations){
                System.out.println("块的长度:"+bLocation.getLength()+"\t块起始偏移量:"+bLocation.getOffset());
                //块所在的DataNode节点
                String[] hosts = bLocation.getHosts();
                System.out.print("DataNode: ");
                for(String str:hosts){
                    System.out.print(str+"\t");
                }
                System.out.println();
            }
            System.out.println("------------------------");
        }
    }

  执行结果如下所示:

Vditor

图3

猜你喜欢

转载自blog.csdn.net/c_lanxiaofang/article/details/107836922