Java Api 操作 HDFS

搭建 hadoop 3.1.2 独立模式,单节点和多节点伪分布式安装与使用

在resource文件夹下放入core-site.xml和hdfs-site.xml

添加依赖

<dependency>
	<groupId>org.apache.hadoop</groupId>
	<artifactId>hadoop-client</artifactId>
	<version>3.1.2</version>
</dependency>

FileSystem是一个通用的文件系统api

Configuration对象封装了客户端和服务器的配置,通过设置配置文件读取类路径来实现。

public class HdfsTest {

    private static Configuration conf;
    private static FileSystem fs;

    static{
        try {
            //读取core-site.xml和hdfs-site.xml
            conf = new Configuration();
            fs = FileSystem.newInstance(conf);
        } catch (IOException e) {
            e.printStackTrace();
        }

        //在jvm关闭时执行,关闭fs
        Runtime.getRuntime().addShutdownHook(new Thread(){
            @Override
            public void run(){
                try{
                    fs.close();
                }catch (IOException e) {
                    e.printStackTrace();
                }
            }
        });
    }

    /**
     * 文件夹或文件是否存在
     */
    @Test
    public void isDirOrFileExist(){
        Path path = new Path("/browerTest");
        try{
            System.out.println("isDirOrFileExist : " + fs.exists(path));
        }catch (IOException e){
            e.printStackTrace();
        }
    }

    /**
     * 提示权限不足,因为读取的事本机的用户名
     * 解决1:使用 FileSystem.newInstance(new URI("hdfs://hadoop-master:9000"),conf,"hadoop"); 指定用户
     * 解决2:系统环境变量添加HADOOP_USER_NAME 为 hadoop
     */
    @Test
    public void mkDirs(){
        Path path = new Path("/test/test1/test2");
        try{
            System.out.println("mkDirs : " + fs.mkdirs(path));
        }catch (IOException e){
            e.printStackTrace();
        }
    }

    /**
     * 创建空文件,没有指定备份数量,默认三份
     */
    @Test
    public void mkFile(){
        Path path = new Path("/test/test1/test2/test2.txt");
        try(
            FSDataOutputStream os = fs.create(path);
            ){
        }catch (IOException e){
            e.printStackTrace();
        }
    }

    /**
     * 上传本地文件
     */
    @Test
    public void uploadFileFromLocal(){
        Path src = new Path("D:\\input335M.txt");
        Path dst = new Path("/upload/test.txt");

        try{
            fs.copyFromLocalFile(src, dst);
        }catch (IOException e){
            e.printStackTrace();
        }
    }

    /**
     * 文件下载
     * copyToLocalFile需要windows安装hadoop环境,简单点用IOUtils.copyBytes
     * IOUtils.copyBytes true会关闭输入输出流
     */
    @Test
    public void downloadFileToLocal(){
        try{
            FSDataInputStreamin = fs.open(new Path("/upload/test.txt"));
            FileOutputStream out = new FileOutputStream("D:\\download.txt");
            IOUtils.copyBytes(in, out, 4096, true);
        }catch (IOException e){
            e.printStackTrace();
        }
    }

    /**
     * 文件夹或文件重命名,和同级的移动
     */
    @Test
    public void mvDirOrFile(){
        Path src = new Path("/test/test1/test2/test2.txt");
        Path dst = new Path("/test/test1/test2/test2Rename.txt");
        try{
            fs.rename(src, dst);
        }catch (IOException e){
            e.printStackTrace();
        }
    }

    /**
     * 复制文件或文件夹
     * 文件夹会把文件夹下的文件都复制
     */
    @Test
    public void cpDirOrFile(){
        Path src = new Path("/test/test1/test2");
        Path dst = new Path("/cp");
        try {
            FileUtil.copy(src.getFileSystem(conf), src, dst.getFileSystem(conf), dst, false, conf);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    /**
     * 删除文件夹或文件
     * true是相当于rm -r,删除文件夹下的文件
     */
    @Test
    public void rmDirOrFile(){
        Path path = new Path("/test/test1/test2");
        try{
            fs.delete(path,true);
        }catch (IOException e){
            e.printStackTrace();
        }
    }

    /**
     * 列出当前dataNode
     */
    @Test
    public void listDataNode(){
        try{
            DistributedFileSystem hdfs = (DistributedFileSystem) fs;
            for(DatanodeInfo datanodeInfo : hdfs.getDataNodeStats()){
                System.out.println(datanodeInfo.getHostName() + " " + datanodeInfo.getName());
            }
        } catch (IOException e){
            e.printStackTrace();
        }
    }
}

参考:
hadoop的客户端调用问题

发布了57 篇原创文章 · 获赞 11 · 访问量 9869

猜你喜欢

转载自blog.csdn.net/qq_36160730/article/details/100020569