zoukankan      html  css  js  c++  java
  • HDFS【Java API操作】

    通过java的api对hdfs的资源进行操作

    代码:上传、下载、删除、移动/修改、文件详情、判断目录or文件、IO流操作上传/下载

    package com.atguigu.hdfsdemo;
    
    import org.apache.hadoop.conf.Configuration;
    import org.apache.hadoop.fs.*;
    import org.apache.hadoop.io.IOUtils;
    import org.junit.After;
    import org.junit.Before;
    import org.junit.Test;
    import java.io.File;
    import java.io.FileInputStream;
    import java.io.FileOutputStream;
    import java.io.IOException;
    import java.net.URI;
    import java.util.Arrays;
    
    /*
     * 1.创建FileSystem对象
     * 2.操作资源
     * 3.关闭资源
     * 4.配置的优先级:代码中的>resource中的配置> 集群中的配置 >集群中得default配置
     */
    public class HdfsDemo {
        FileSystem fs;
        Configuration conf;
    
        //1.创建Filesystem对象
        @Before
        public void createFileSystem() throws IOException, InterruptedException {
            //配置的优先级:代码中的>resource中的配置> 集群中的配置 >集群中得default配置
            conf = new Configuration();
            //conf.set("dfs.replication","1"); //设置副本数
            // 获取filesystem对象
            fs = FileSystem.get(URI.create("hdfs://hadoop102:9820"), conf, "atguigu");
        }
    
        //3.关闭资源
        @After
        public void closeResource() throws IOException {
            if (fs != null) {
                fs.close();
            }
        }
    
        /**
         * 上传文件
         *
         * @throws IOException
         */
        @Test
        public void upload() throws IOException {
            /**
             * boolean delSrc:是否删除源文件
             * boolean overwrite:如果目标地址如果已经存在和上传对象一样名字的文件是否覆盖;如果为true,那么就覆盖;如果为false但名字又相同那么就抛异常
             * Path src:源文件
             * Path dst:目标地址
             */
            fs.copyFromLocalFile(false, false, new Path("F:/sanguo.txt"), new Path("/user"));
        }
    
        /**
         * 文件下载
         *
         * @throws IOException
         */
        @Test
        public void download() throws IOException {
            /**
             * boolean delSrc:是否删除源文件
             * Path src:源文件
             * Path dst:目标地址
             * boolean useRawLocalFileSystem :就否使用crc校验
             */
            fs.copyToLocalFile(false, new Path("/user/aaa.txt"), new Path("F:/"), true);
        }
    
        /**
         * 删除文件夹
         *
         * @throws IOException
         */
        @Test
        public void deleteDir() throws IOException {
            /**
             * Path f:删除的路径
             * boolean recursive :是否递归?
             *                     如果删除的是目录那么必须是true,否则抛异常
             *                     如果删除的是文件那么true和false都可以
             */
            boolean result = fs.delete(new Path("/deleteDir"), true);
            System.out.println("文件是否删除成功:" + result);
        }
    
        /**
         * 移动文件、修改文件名
         */
        @Test
        public void moveOrUpdateName() throws IOException {
            //移动文件
            boolean result = fs.rename(new Path("/rename.txt"), new Path("/user/"));
            System.out.println("是否移动成功" + result);
            //修改文件名
            boolean rename = fs.rename(new Path("/user/rename.txt"), new Path("/user/afterRename.txt"));
            System.out.println("文件名是否修改成功" + rename);
        }
    
        /**
         * 查看文件详情:文件名、权限、长度、所属组、所属者、副本数、块信息
         *
         * @throws IOException
         */
        @Test
        public void showFileDetail() throws IOException {
            /**
             * 获取迭代器
             * Path f:查看的文件or目录
             * final boolean recursive:是否递归
             */
            RemoteIterator<LocatedFileStatus> fileIterator = fs.listFiles(new Path("/"), true);
            while (fileIterator.hasNext()) {
                LocatedFileStatus file = fileIterator.next();
                //文件名
                System.out.println("*****************" + file.getPath().getName() + "*****************");
                //权限
                System.out.println(file.getPermission());
                //长度
                System.out.println(file.getLen());
                //所属组
                System.out.println(file.getGroup());
                //所属者
                System.out.println(file.getOwner());
                //副本数
                System.out.println(file.getReplication());
                //块信息
                BlockLocation[] blockLocations = file.getBlockLocations();
                for (BlockLocation blockLocation : blockLocations) {
                    //输出块信息
                    System.out.println(Arrays.toString(blockLocation.getHosts()));
                }
                //输出结果
                /******************hadoop103_34807*****************
                 rw-r-----
                 133781
                 atguigu
                 atguigu
                 3
                 [hadoop102, hadoop103, hadoop104]*/
    
            }
    
        }
    
        /**
         * 判断文件or目录?
         */
        @Test
        public void fileOrDir() throws IOException {
            FileStatus[] fileStatuses = fs.listStatus(new Path("/"));
            for (FileStatus fileStatus : fileStatuses) {
                System.out.println("*****" + fileStatus.getPath().getName() + "*****");
                if (fileStatus.isFile()) {
                    System.out.println("文件");
                } else {
                    System.out.println("目录");
                }
            }
        }
    
        /**
         * 通过IO流上传下载
         */
        @Test
        public void uploadAndDownloadByIO() throws IOException {
            //需求一:将本地f盘的sanguo.txt文件上传到HDFS的根目录"/"
            //创建输入流
            FileInputStream fis = new FileInputStream(new File("F:/sanguo.txt"));
            //创建输出流
            FSDataOutputStream fos = fs.create(new Path("/sanguo.txt"));
            //流对拷
            IOUtils.copyBytes(fis, fos, conf);
            IOUtils.closeStream(fis);
            IOUtils.closeStream(fos);
            //需求二:将hdfs的"/user/bbb.txt"文件下载到本地f盘根目录"F:/"
            FSDataInputStream fis2 = fs.open(new Path("/user/bbb.txt"));
            FileOutputStream fos2 = new FileOutputStream(new File("F:/bbb.txt"));
            IOUtils.copyBytes(fis2, fos2, conf);
            IOUtils.closeStream(fis2);
            IOUtils.closeStream(fos2);
        }
    }
    
    
  • 相关阅读:
    testng失败截图,注解方式调用。
    HttpURLConnection和HttpClient
    JDK中的URLConnection参数详解
    如何做好Web接口测试
    selenium webdriver定位不到元素的五种原因及解决办法
    Selenium(Webdriver)自动化测试常问到的问题解答(转自:潜龙0318)
    常用网址记录
    python set
    python 浅拷贝和深拷贝
    python 元组
  • 原文地址:https://www.cnblogs.com/wh984763176/p/13122061.html
Copyright © 2011-2022 走看看