使用FileSystem API读写HDFS数据

作者:API传播员 · 2025-11-14 · 阅读时间:5分钟
本文详细演示如何使用FileSystem API在HDFS中读写数据,包括编写Java应用程序实现本地文件与HDFS间的数据传输,并介绍create()和open()等核心方法。长尾关键词:HDFS文件读写操作、FileSystem API使用方法。

使用 FileSystem API 将数据读写到 HDFS

Hadoop 分布式文件系统(HDFS)提供了多种方式来读取和写入数据。本文将通过使用 FileSystem API,演示如何在 HDFS 中创建文件并写入数据,以及如何从 HDFS 读取文件并将其写回本地文件系统。


使用 FileSystem API 写入数据到 HDFS

以下是将本地文件写入 HDFS 的步骤:

步骤 1:编写 HdfsWriter 应用程序

首先,我们需要编写一个 Java 应用程序,从本地文件系统读取文件并将其内容写入 HDFS。以下是代码示例:

package com.hadoop.hdfs.writer;

import org.apache.hadoop.conf.Configured;
import org.apache.hadoop.util.Tool;
import java.io.BufferedInputStream;
import java.io.FileInputStream;
import java.io.InputStream;
import java.io.OutputStream;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.io.IOUtils;
import org.apache.hadoop.util.ToolRunner;

public class HdfsWriter extends Configured implements Tool {

    public static final String FS_PARAM_NAME = "fs.defaultFS";

    public int run(String[] args) throws Exception {

        if (args.length < 2) {
            System.err.println("HdfsWriter [local input path] [hdfs output path]");
            return 1;
        }

        String localInputPath = args[0];
        Path outputPath = new Path(args[1]);
        Configuration conf = getConf();
        System.out.println("configured filesystem = " + conf.get(FS_PARAM_NAME));
        FileSystem fs = FileSystem.get(conf);
        if (fs.exists(outputPath)) {
            System.err.println("output path exists");
            return 1;
        }
        OutputStream os = fs.create(outputPath);
        InputStream is = new BufferedInputStream(new FileInputStream(localInputPath));
        IOUtils.copyBytes(is, os, conf);
        return 0;
    }

    public static void main(String[] args) throws Exception {
        int returnCode = ToolRunner.run(new HdfsWriter(), args);
        System.exit(returnCode);
    }
}

步骤 2:运行 HdfsWriter 程序

将上述代码导出为 Jar 文件,并通过以下命令运行程序,将本地文件写入 HDFS:

hadoop jar HdfsWriter.jar com.hadoop.hdfs.writer.HdfsWriter sample.txt /user/training/HdfsWriter_sample.txt

步骤 3:验证写入结果

运行以下命令,检查文件是否已成功写入 HDFS,并查看文件内容:

hadoop fs -cat /user/training/HdfsWriter_sample.txt

使用 FileSystem API 从 HDFS 读取数据

接下来,我们编写一个应用程序,从 HDFS 读取文件并将其内容写回本地文件系统。

步骤 4:编写 HdfsReader 应用程序

以下是读取 HDFS 文件并写回本地文件系统的代码示例:

package com.hadoop.hdfs.reader;

import java.io.BufferedOutputStream;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.io.OutputStream;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.conf.Configured;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.io.IOUtils;
import org.apache.hadoop.util.Tool;
import org.apache.hadoop.util.ToolRunner;

public class HdfsReader extends Configured implements Tool {

    public static final String FS_PARAM_NAME = "fs.defaultFS";

    public int run(String[] args) throws Exception {

        if (args.length < 2) {
            System.err.println("HdfsReader [hdfs input path] [local output path]");
            return 1;
        }

        Path inputPath = new Path(args[0]);
        String localOutputPath = args[1];
        Configuration conf = getConf();
        System.out.println("configured filesystem = " + conf.get(FS_PARAM_NAME));
        FileSystem fs = FileSystem.get(conf);
        InputStream is = fs.open(inputPath);
        OutputStream os = new BufferedOutputStream(new FileOutputStream(localOutputPath));
        IOUtils.copyBytes(is, os, conf);
        return 0;
    }

    public static void main(String[] args) throws Exception {
        int returnCode = ToolRunner.run(new HdfsReader(), args);
        System.exit(returnCode);
    }
}

步骤 5:运行 HdfsReader 程序

将上述代码导出为 Jar 文件,并通过以下命令运行程序,从 HDFS 读取文件并写回本地文件系统:

hadoop jar HdfsReader.jar com.hadoop.hdfs.reader.HdfsReader /user/training/HdfsWriter_sample.txt /home/training/HdfsReader_sample.txt

步骤 6:验证读取结果

运行以下命令,检查文件是否已成功写回本地文件系统:

hadoop fs -cat /user/training/HdfsWriter_sample.txt

FileSystem API 的核心概念

FileSystem 是一个抽象类,用于表示通用文件系统。Hadoop 的大多数文件系统实现都可以通过 FileSystem 对象进行访问和操作。以下是使用 FileSystem API 的一些关键点:

  1. 创建 FileSystem 实例
    调用 FileSystem.get() 方法可以创建 HDFS 的实例。该方法会根据 Hadoop 配置文件中 fs.defaultFS 参数的 URI,选择正确的 FileSystem 实现。

  2. 创建文件
    使用 create() 方法在 HDFS 中创建文件。该方法返回一个 OutputStream 对象,可以通过 Java I/O 方法进行操作。

  3. 读取文件
    使用 open() 方法在 HDFS 中打开文件。该方法返回一个 InputStream 对象,用于读取文件内容。


FileSystem API 的其他常用方法

以下是一些常用的 FileSystem API 方法及其用途:

  • 检查文件是否存在
    在调用 create() 方法之前,可以使用以下代码检查文件是否已存在:

    boolean exists = fs.exists(inputPath);
  • 检查路径是否为文件
    使用以下代码检查路径是否为文件:

    boolean isFile = fs.isFile(inputPath);
  • 重命名文件
    使用以下代码重命名已存在的文件:

    boolean renamed = fs.rename(inputPath, new Path("old_file.txt"));

通过这些方法,开发者可以更高效地操作 HDFS 文件系统。


总结

通过本文的示例,我们学习了如何使用 FileSystem API 在 HDFS 中读写数据。FileSystem API 提供了丰富的功能,能够满足大多数 HDFS 文件操作需求。掌握这些方法后,您可以根据实际需求灵活地操作 HDFS 文件系统。

原文链接: https://princetonits.com/blog/technology/using-filesystem-api-to-read-and-write-data-to-hdfs/
热门推荐
一个账号试用1000+ API
助力AI无缝链接物理世界 · 无需多次注册