HDFS 提供了丰富的操作接口,包括 Linux Shell 命令、Web 管理页面以及 Java API。本文将基于 Hadoop 3.1.3 版本,梳理常用命令用法,展示 Web 监控面板,并通过实战案例讲解 Java API 的文件操作与部署流程。
一、HDFS 常用 Shell 命令
hadoop fs 是操作 HDFS 最通用的入口,适用于本地及分布式文件系统。相比之下,hadoop dfs 和 hdfs dfs 仅针对 HDFS。基本语法如下:
hadoop fs [genericOptions][commandOptions]
常用指令包括查看目录结构、上传下载、修改权限等。例如使用 -ls 列出文件详情,-cat 查看内容,-mkdir 创建目录。对于批量操作,-copyFromLocal 和 -put 用于上传,-get 和 -copyToLocal 用于下载。权限管理可使用 -chmod 和 -chown,递归操作需加上 -R 参数。此外,-rm -r 可删除目录及其内容,-setrep 调整副本系数。若需检查文件状态,-test 配合 -e(存在)、-z(空文件)、-d(目录)选项非常实用。
二、HDFS Web 管理界面
配置完成后,可通过浏览器访问 NameNode 的 Web 端口(默认 9870)。地址格式通常为 http://[NameNodeIP]:9870。伪分布式环境下可直接访问 http://localhost:9870。
该界面直观展示了节点分布、存储日志及文件浏览功能。虽然大部分操作可通过 Shell 完成,但 Web 端更适合快速排查问题。例如,点击 "Browse the filesystem" 即可查看根目录,这与执行 hadoop fs -ls / 效果一致。
三、HDFS Java API 实战
Hadoop 核心基于 Java,API 交互是开发集成方案的基础。主要涉及 FileSystem、FileStatus、FSDataInputStream 等类。下面通过一个合并文件的实例,演示从环境搭建到部署的全过程。
1. 项目初始化
在 Eclipse 中新建 Java 工程,命名为 HDFSExample。选择 JDK 1.8 及以上版本,保持默认工作空间即可。
2. 添加依赖库
HDFS 交互需要引入 Hadoop 的 JAR 包。定位到 Hadoop 安装目录下的 share/hadoop 文件夹,将以下目录中的 JAR 包添加到项目构建路径:
common目录下的所有 JAR 包(排除 jdiff、lib 等子目录)common/lib目录下的所有 JAR 包hdfs目录下的所有 JAR 包hdfs/lib目录下的所有 JAR 包
全选时注意避开非编译资源目录。添加完毕后,工程即可识别相关类。
3. 编写业务逻辑
新建类 MergeFile,实现文件过滤与合并功能。核心思路是利用 FileSystem 获取对象,通过 listStatus 遍历文件,结合自定义 PathFilter 排除特定后缀(如 .abc),最后将剩余文件内容写入目标文件。
import java.io.IOException;
java.io.PrintStream;
java.net.URI;
org.apache.hadoop.conf.Configuration;
org.apache.hadoop.fs.*;
{
;
MyPathFilter(String reg) {
.reg = reg;
}
{
(!(path.toString().matches(reg))) ;
;
}
}
{
;
;
{
.inputPath = (input);
.outputPath = (output);
}
IOException {
();
conf.set(, );
conf.set(, );
FileSystem.get(URI.create(inputPath.toString()), conf);
FileSystem.get(URI.create(outputPath.toString()), conf);
FileStatus[] sourceStatus = fsSource.listStatus(inputPath, ());
fsDst.create(outputPath);
(System.out);
(FileStatus sta : sourceStatus) {
System.out.print( + sta.getPath() + + sta.getLen() + + sta.getPermission() + );
fsSource.open(sta.getPath());
[] data = [];
-;
((read = fsdis.read(data)) > ) {
ps.write(data, , read);
fsdos.write(data, , read);
}
fsdis.close();
}
ps.close();
fsdos.close();
}
IOException {
(, );
merge.doMerge();
}
}


