HDFS 分布式文件系统编程实践与常用命令详解
在大数据生态中,操作 HDFS 通常有三种途径:Shell 命令、Web UI 界面以及 Java API。本文将结合实际场景,梳理这些工具的使用细节,重点讲解如何通过 Java API 进行文件读写与合并操作。
HDFS 常用 Shell 命令
hadoop fs 是操作 HDFS 最通用的入口,它兼容本地文件系统与 HDFS。相比之下,hadoop dfs 和 hdfs dfs 则专用于 HDFS。
以下是一些高频命令及其用途:
ls/ls -R: 查看目录详情或递归列出。cat/tail: 读取文件内容或监控尾部更新。mkdir/rm: 创建或删除目录(支持-r递归)。put/get: 本地与 HDFS 之间的文件传输。cp/mv: 文件复制与移动。chmod/chown: 权限管理(需超级用户)。copyFromLocal/copyToLocal: 明确指定本地到 HDFS 的传输方向。expunge: 清空回收站。setrep: 修改副本系数。
具体用法可参考官方文档,例如 hadoop fs -ls <path> 显示指定路径的文件信息,hadoop fs -mkdir -p <paths> 递归创建文件夹。
通过 Web 页面管理
配置完成后,访问 NameNode 的 Web 端口(默认 9870)即可直观查看集群状态。这里可以浏览文件系统、查看日志,甚至下载特定数据节点的文件。虽然功能丰富,但大部分操作都能通过上述 Shell 命令等价实现。
Java API 编程实战
Hadoop 核心基于 Java,因此掌握其 API 对开发至关重要。主要涉及 FileSystem、FileStatus、FSDataInputStream 等类。
环境准备
在 IDE 中创建项目后,需要引入 Hadoop 相关的 JAR 包。通常位于安装目录下的 share/hadoop/common 和 share/hadoop/hdfs 文件夹中。确保包含 hadoop-common、hadoop-hdfs 及其依赖库。注意版本兼容性,建议统一使用同一版本的 Hadoop 发行版。
代码示例:文件合并
下面演示一个实用场景:将 HDFS 指定目录下的多个文件合并为一个输出文件,并过滤掉特定后缀的文件。
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 {
;
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();
}
}


