使用FileSystem API读写HDFS数据
使用 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 的一些关键点:
-
创建 FileSystem 实例
调用FileSystem.get()方法可以创建 HDFS 的实例。该方法会根据 Hadoop 配置文件中fs.defaultFS参数的 URI,选择正确的 FileSystem 实现。 -
创建文件
使用create()方法在 HDFS 中创建文件。该方法返回一个OutputStream对象,可以通过 Java I/O 方法进行操作。 -
读取文件
使用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/