首页 > 编程语言 >HDFS Java API

HDFS Java API

时间:2022-11-08 15:48:14浏览次数:38  
标签:HDFS Java hdfs System API 文件 println Path out

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

 

标签:HDFS,Java,hdfs,System,API,文件,println,Path,out
From: https://www.cnblogs.com/ooo0/p/16869872.html

相关文章