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;
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 集群已启动,且 /user/hadoop 目录下存在测试文件(如 file1.txt 至 file5.txt)。在 Eclipse 中选择 Run As -> Java Application 执行主方法。控制台会输出处理日志,同时生成 merge.txt。
验证结果可在终端执行 hdfs dfs -cat /user/hadoop/merge.txt,确认内容是否按预期合并。
5. 打包部署
生产环境中通常将应用打包为 JAR 提交给 YARN 或本地运行。在 Eclipse 中选择 Export -> Runnable JAR file。
- Launch configuration 选择
MergeFile类。 - Export destination 指定输出路径,如
/usr/local/hadoop/myapp/HDFSExample.jar。 - Library handling 选择
Extract required libraries into generated JAR,以便包含所有依赖。
导出成功后,使用 hadoop jar ./myapp/HDFSExample.jar 命令即可在集群上运行。
总结
本文涵盖了 HDFS 操作的三种主要方式:Shell 命令适合运维管理,Web 界面便于可视化监控,而 Java API 则是开发集成应用的核心。通过上述实例,我们掌握了从依赖配置、代码编写到打包部署的完整链路。在实际开发中,注意配置文件路径的正确性及异常处理,能有效提升程序的稳定性。

