• HDFS Java API


    HDFS(Hadoop Distributed File System)是Hadoop项目的核心子项目,在大数据开发中通过分布式计算对海量数据进行存储与管理。它基于流数据模式访问和处理超大文件的需求而开发

    FileSystem是HDFS Java API的核心工具类,该类是一个抽象类,其中封装了很多操作文件的方法,使用这些方法可以很轻松地操作HDFS中的文件。

    package com.xc.xcspringboot.test;
    
    import org.apache.hadoop.conf.Configuration;
    import org.apache.hadoop.fs.FSDataOutputStream;
    import org.apache.hadoop.fs.FileStatus;
    import org.apache.hadoop.fs.FileSystem;
    import org.apache.hadoop.fs.Path;
    import org.apache.hadoop.io.IOUtils;
    import org.apache.hadoop.util.Progressable;
    
    import java.io.BufferedInputStream;
    import java.io.FileInputStream;
    import java.io.IOException;
    import java.io.InputStream;
    import java.sql.Timestamp;
    
    public class HdfsApiTest {
    
        private static FileSystem hdfs;
    
        static {
            Configuration conf = new Configuration();
            //设置HDFS访问地址
            conf.set("fs.default.name", "hdfs://172.19.25.168:9000");
            try {
                //取得FileSystem文件系统实例
                hdfs = FileSystem.get(conf);
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    
        public static void main(String[] args) throws Exception {
    //        mkdirs(hdfs);
    //        createFile(hdfs);
    //        createFileProgressable(hdfs);
    //        getFile(hdfs);
    //        deleteFile(hdfs);
    //        listStatus(hdfs);
    //        getFileStatus(hdfs);
    //        copyFromLocalFile(hdfs);
            copyToLocalFile(hdfs);
        }
    
        /**
         * 创建目录
         */
        public static void mkdirs(FileSystem hdfs) throws IOException {
            boolean isok = hdfs.mkdirs(new Path("hdfs:/mydir"));
            if (isok) {
                System.out.println("创建目录成功!");
            } else {
                System.out.println("创建目录失败! ");
            }
        }
    
        /**
         * 创建文件
         */
        public static void createFile(FileSystem hdfs) throws Exception {
            //打开一个输出流
            FSDataOutputStream outputStream = hdfs.create(new Path("hdfs:/mydir/newfile2.txt"));
            //写入文件内容
            outputStream.write("我是文件内容".getBytes());
            System.out.println("文件创建成功! ");
        }
    
        /**
         * 查询HDFS文件内容并输出
         */
        public static void getFile(FileSystem hdfs) throws IOException {
            //打开文件输入流
            InputStream in = hdfs.open(new Path("hdfs:/mydir/newfile2.txt"));
            //输出文件内容
            IOUtils.copyBytes(in, System.out, 4096, false);
        }
    
        /**
         * 上传文件并监控上传进度
         */
        public static void createFileProgressable(FileSystem hdfs) throws IOException {
            InputStream in = new BufferedInputStream(new FileInputStream("D:/导入导出/Java大全(2021年).pdf"));
            //上传文件并监控上传进度
            FSDataOutputStream outputStream = hdfs.create(new Path("hdfs:/mydir/Java大全(2021年).pdf"),
                    new Progressable() {
                        @Override
                        public void progress() {//回调 方法显示进度
                            System.out.println(".");
                        }
                    });
            IOUtils.copyBytes(in, outputStream, 4096, false);
        }
    
        /**
         * 删除文件
         */
        public static void deleteFile(FileSystem hdfs) throws Exception {
            Path path = new Path("hdfs:/mydir/newfile2.txt");
            //删除文件
            boolean isok = hdfs.deleteOnExit(path);
            if (isok) {
                System.out.println("删除成功!");
            } else {
                System.out.println("删除失败! ");
            }
        }
    
        /**
         * 递归遍历目录和文件
         */
        public static void listStatus(FileSystem hdfs) throws IOException {
            //遍历HDFS上的文件和目录
            FileStatus[] fs = hdfs.listStatus(new Path("hdfs:/"));
            if (fs.length > 0) {
                for (FileStatus f : fs) {
                    showDir(f);
                }
            }
        }
    
        private static void showDir(FileStatus fs) throws IOException {
            Path path = fs.getPath();
            //输出文件或目录的路径
            System.out.println(path);
            //如果是目录,则递归遍历该目录下的所有子目录或文件
            if (fs.isDirectory()) {
                FileStatus[] f = hdfs.listStatus(path);
                if (f.length > 0) {
                    for (FileStatus file : f) {
                        showDir(file);
                    }
    
                }
            }
        }
    
        /**
         * 获取文件或目录的元数据
         */
        public static void getFileStatus(FileSystem hdfs) throws IOException {
            Path path = new Path("hdfs:/mydir/newfile2.txt");
            FileStatus fileStatus = hdfs.getFileStatus(path);
            //判断是文件夹还是文件
            if (fileStatus.isDirectory()) {
                System.out.println("这是一个文件夹");
            } else {
                System.out.println("这是一个文件");
                //输出元数据信息
                System.out.println("文件路径: " + fileStatus.getPath());
                System.out.println("文件修改日期: " + new Timestamp(fileStatus.getModificationTime()).toString());
                System.out.println("文件上次访问日期: " + new Timestamp(fileStatus.getAccessTime()).toString());
                System.out.println("文件长度: " + fileStatus.getLen());
                System.out.println("文件备份数: " + fileStatus.getReplication());
                System.out.println("文件块大小: " + fileStatus.getBlockSize());
                System.out.println("文件所有者:" + fileStatus.getOwner());
                System.out.println("文件所在分组: " + fileStatus.getGroup());
                System.out.println("文件的权限: " + fileStatus.getPermission().toString());
            }
        }
    
        /**
         * 上传本地文件
         */
        public static void copyFromLocalFile(FileSystem hdfs) throws IOException {
            //创建可供hadoop使用的文件系统路径
            Path src = new Path("D:/xc-desktop/日志1.txt"); //本地目录/文件
            Path dst = new Path("hdfs:/mydir/日志1.txt"); //HDFS目录/文件
            //复制上传本地文件至HDFS文件系统中
            hdfs.copyFromLocalFile(src, dst);
            System.out.println("文件上传成功!");
        }
    
        /**
         * 下载文件到本地
         */
        public static void copyToLocalFile(FileSystem hdfs) throws IOException {
            //创建可供hadoop使用的文件系统路径
            Path src = new Path("hdfs:/mydir/日志1.txt"); //HDFS目录/文件
            Path dst = new Path("D:/xc-desktop/日志1.txt"); //本地目录/文件
            //4.从HDFS文件系统中复制下载文件至本地
            hdfs.copyToLocalFile(false, src, dst, true);
            System.out.println("文件下载成功!");
        }
    
    
    }
    

    书籍:Hadoop大数据技术开发实战 4.4 HDFS Java API操作

    https://gitee.com/caoyeoo0/xc-springboot/blob/hadoopApi/src/main/java/com/xc/xcspringboot/test/HdfsApiTest.java

  • 相关阅读:
    通过网格拆分高德地图
    vue-router重定向 不刷新问题
    vue-scroller记录滚动位置
    鼠标滚轮更改transform的值(vue-scroller在PC端的上下滑动)
    position sticky的兼容
    js截图及绕过服务器图片保存至本地(html2canvas)
    禁止页面回退到某个页面(如避免登录成功的用户返回到登录页)
    手动创建script解决跨域问题(jsonp从入门到放弃)
    逻辑回归的常见面试点总结
    听说你不会调参?TextCNN的优化经验Tricks汇总
  • 原文地址:https://www.cnblogs.com/ooo0/p/16869872.html
Copyright © 2020-2023  润新知