HDFS 提供了多种访问方式,除了命令行操作和 Web 界面监控外,Java API 是进行自动化开发和集成最核心的手段。本文将介绍 Linux 下常用的 Shell 命令、Web 页面查看方法,并重点通过实例演示如何利用 Java API 完成文件上传、合并等操作。
一、HDFS 常用命令
在 Linux 环境中,hadoop fs 是最通用的命令,适用于本地文件和 HDFS。此外还有 hadoop dfs 和 hdfs dfs,后两者仅针对 HDFS。基本用法如下:
hadoop fs [genericOptions][commandOptions]
以下是一些高频使用的命令:
hadoop fs -ls <path>:显示指定路径的文件详细信息。hadoop fs -cat <path>:将文件内容输出到标准输出。hadoop fs -mkdir [-p] <paths>:创建文件夹,-p支持递归创建。hadoop fs -copyFromLocal <localsrc> <dst>:从本地复制文件到 HDFS。hadoop fs -put <localsrc> <dst>:功能同 copyFromLocal,也支持从 stdin 读取。hadoop fs -rm -r <path>:递归删除目录及其内容。hadoop fs -setrep [-R] <path>:修改文件副本系数。hadoop fs -getmerge [-nl] <src> <localdst>:合并源目录下的文件到本地。
二、HDFS 的 Web 页面
配置好集群后,可以通过浏览器访问 NameNode 的 Web UI(默认端口 9870)。例如伪分布式模式下访问 http://localhost:9870。这里可以直观地浏览文件系统结构、查看节点日志以及下载特定数据块。虽然 Web 界面方便查看,但日常运维和开发中更推荐使用 Shell 命令或 API 来实现自动化管理。
三、HDFS 常用 Java API 及应用实例
Hadoop 基于 Java 实现,通过调用 Java API 可以灵活地与 HDFS 交互。以下是核心类说明:
org.apache.hadoop.fs.FileSystem:通用文件系统抽象基类,所有 HDFS 操作的基础。org.apache.hadoop.fs.FileStatus:展示文件和目录的元数据,如大小、权限、所有者等。org.apache.hadoop.fs.FSDataInputStream/OutputStream:用于读写 HDFS 文件的流。org.apache.hadoop.conf.Configuration:管理配置项,优先读取 core-site.xml。org.apache.hadoop.fs.Path:表示文件系统路径。
应用实例:文件合并
下面通过一个实际案例,演示如何编写 Java 程序合并 HDFS 中的多个文件,并过滤掉特定后缀的文件。
1. 项目准备
在 Eclipse 中创建一个名为 HDFSExample 的 Java 工程。确保 JDK 版本与 Hadoop 环境兼容(推荐 JDK 1.8)。
2. 添加依赖库
进入项目属性设置,在 Libraries 选项卡中添加外部 JAR 包。需要包含以下目录下的所有 jar 文件(注意排除 jdiff、lib、sources 等目录):
/usr/local/hadoop/share/hadoop/common/usr/local/hadoop/share/hadoop/common/lib/usr/local/hadoop/share/hadoop/hdfs/usr/local/hadoop/share/hadoop/hdfs/lib
这确保了程序能正确识别 HDFS 协议和配置。
3. 编写代码
新建类 MergeFile,主要逻辑包括初始化 Configuration、获取 FileSystem 实例、遍历文件列表并写入目标文件。代码如下:
import java.io.IOException;
import java.io.PrintStream;
import java.net.URI;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.*;
/**
* 过滤掉文件名满足特定条件的文件
*/
class MyPathFilter implements PathFilter {
String reg = null;
MyPathFilter(String reg) {
this.reg = reg;
}
public boolean accept(Path path) {
if (!(path.toString().matches(reg))) return true;
return false;
}
}
/**
* 利用 FSDataOutputStream 和 FSDataInputStream 合并 HDFS 中的文件
*/
public class MergeFile {
Path inputPath = null; // 待合并的文件所在的目录的路径
Path outputPath = null; // 输出文件的路径
public MergeFile(String input, String output) {
this.inputPath = new Path(input);
this.outputPath = new Path(output);
}
public void doMerge() throws IOException {
Configuration conf = new Configuration();
conf.set("fs.defaultFS", "hdfs://localhost:9000");
conf.set("fs.hdfs.impl", "org.apache.hadoop.hdfs.DistributedFileSystem");
FileSystem fsSource = FileSystem.get(URI.create(inputPath.toString()), conf);
FileSystem fsDst = FileSystem.get(URI.create(outputPath.toString()), conf);
// 过滤掉输入目录中后缀为 .abc 的文件
FileStatus[] sourceStatus = fsSource.listStatus(inputPath, new MyPathFilter(".*\\.abc"));
FSDataOutputStream fsdos = fsDst.create(outputPath);
PrintStream ps = new PrintStream(System.out);
for (FileStatus sta : sourceStatus) {
System.out.print("路径:" + sta.getPath() + " 文件大小:" + sta.getLen() + " 权限:" + sta.getPermission() + " 内容:");
FSDataInputStream fsdis = fsSource.open(sta.getPath());
byte[] data = new byte[1024];
int read = -1;
while ((read = fsdis.read(data)) > 0) {
ps.write(data, 0, read);
fsdos.write(data, 0, read);
}
fsdis.close();
}
ps.close();
fsdos.close();
}
public static void main(String[] args) throws IOException {
MergeFile merge = new MergeFile("hdfs://localhost:9000/user/hadoop/", "hdfs://localhost:9000/user/hadoop/merge.txt");
merge.doMerge();
}
}
4. 运行与验证
确保 Hadoop 集群已启动,且 HDFS 中存在测试文件(如 file1.txt, file2.txt 等)。在 Eclipse 中直接运行 main 方法。控制台会输出处理过程信息。运行结束后,可通过终端命令验证结果:
hdfs dfs -cat /user/hadoop/merge.txt
5. 部署到集群
若需在集群上独立运行,需将项目打包为 JAR 文件。在 Eclipse 中选择 Export -> Runnable JAR file,选择主类 MergeFile,勾选 "Extract required libraries into generated JAR",导出为 HDFSExample.jar。
将 JAR 包上传至服务器后,使用 hadoop jar 命令提交任务:
hadoop jar ./myapp/HDFSExample.jar
总结
本文梳理了 HDFS 的三种主要操作方式。Shell 命令适合快速运维,Web 界面适合状态监控,而 Java API 则是构建大数据应用的基础。通过上述合并文件的实例,展示了从环境配置、依赖引入到代码编写及部署的全流程。掌握这些 API 细节,能帮助开发者更高效地处理分布式存储中的数据流转问题。

