HDFS Java API

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

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

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
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

 

posted @   草木物语  阅读(253)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
点击右上角即可分享
微信分享提示