本文是大数据系列第 9 篇,通过 Java 代码操作 HDFS,掌握 Hadoop 提供的 Java Client API。

完整图文版(含完整代码):CSDN 原文 | 掘金

Maven 依赖

<dependencies>
  <dependency>
    <groupId>org.apache.hadoop</groupId>
    <artifactId>hadoop-common</artifactId>
    <version>2.9.0</version>
  </dependency>
  <dependency>
    <groupId>org.apache.hadoop</groupId>
    <artifactId>hadoop-hdfs</artifactId>
    <version>2.9.0</version>
  </dependency>
  <dependency>
    <groupId>org.apache.hadoop</groupId>
    <artifactId>hadoop-mapreduce-client-core</artifactId>
    <version>2.9.0</version>
  </dependency>
  <dependency>
    <groupId>org.apache.hadoop</groupId>
    <artifactId>hadoop-mapreduce-client-common</artifactId>
    <version>2.9.0</version>
  </dependency>
</dependencies>

三个核心类

说明
FileSystemHDFS 操作的抽象基类,所有文件操作入口
PathHDFS 路径封装(不同于 java.io.File)
Configuration加载 Hadoop 配置(core-site.xml 等)

初始化 FileSystem

Configuration conf = new Configuration();
conf.set("fs.defaultFS", "hdfs://h121.wzk.icu:9000");
FileSystem fs = FileSystem.get(conf);

创建目录

fs.mkdirs(new Path("/test/java"));

上传文件(PUT)

// copyFromLocalFile(src, dst)
fs.copyFromLocalFile(
    new Path("/local/test.txt"),
    new Path("/test/java/test.txt")
);

下载文件(GET)

// copyToLocalFile(src, dst)
fs.copyToLocalFile(
    new Path("/test/java/test.txt"),
    new Path("/local/download/test.txt")
);

删除文件

// delete(path, recursive)
fs.delete(new Path("/test/java/test.txt"), false);
// 递归删除目录
fs.delete(new Path("/test/java"), true);

列出目录

FileStatus[] statuses = fs.listStatus(new Path("/test"));
for (FileStatus s : statuses) {
    System.out.println(s.getPath().getName() + " - " + s.getLen());
}

流式操作(支持进度条)

// PUT(带进度显示)
try (FSDataOutputStream out = fs.create(new Path("/test/stream.txt"),
        progress -> System.out.print("."))) {
    out.write("hello hdfs".getBytes());
}

// GET(流式读取)
try (FSDataInputStream in = fs.open(new Path("/test/stream.txt"))) {
    byte[] buffer = new byte[1024];
    int len;
    while ((len = in.read(buffer)) != -1) {
        System.out.write(buffer, 0, len);
    }
}

Seek 定位读取

FSDataInputStream in = fs.open(new Path("/test/file.txt"));
in.seek(100);  // 跳到第 100 字节
// 继续读取...
in.close();

使用完毕关闭

fs.close();

完整工程代码(含 log4j.properties 配置)见 CSDN 原文

下一篇:大数据-10 Java 实现 MapReduce WordCount