本教程基于提供的 hdfsClient
类代码,详细说明 HDFS 文件系统常见操作。代码通过 Hadoop 的 FileSystem
API 实现文件上传、下载、元数据查看等功能。
一、核心配置与连接
1. 创建 Configuration 对象
Configuration configuration = new Configuration();
configuration.set("dfs.replication", "2"); // 设置上传文件副本数为2(默认3)
作用:
Configuration
加载 Hadoop 核心配置(如core-site.xml
,hdfs-site.xml
)dfs.replication
指定文件在 HDFS 中的副本数量
2. 获取 FileSystem 实例
FileSystem fs = FileSystem.get(
new URI("hdfs://bigdata01:8020"), // NameNode地址
configuration,
"root" // 操作HDFS的用户名
);
参数说明:
URI
:HDFS 集群地址(格式hdfs://主机名:端口
)user
:执行操作的系统用户(需有HDFS权限)
二、文件操作详解
1. 文件上传
fs.copyFromLocalFile(
new Path("c:/Users/admin/Desktop/Test.txt"), // 本地文件路径
new Path("/xiyou/huaguoshan/sunwukong.txt") // HDFS目标路径
);
特点:
- 自动创建父目录(如
/xiyou/huaguoshan
) - 上传后本地文件保留
2. 文件下载
fs.copyToLocalFile(
false, // 不删除源文件(true会删除HDFS文件)
new Path("/xiyou/huaguoshan.txt"), // HDFS源路径
new Path("c:/Users/admin/Desktop/Test2.txt"), // 本地目标路径
true // 使用原生本地文件系统校验
);
典型错误:
路径权限不足或本地目录不存在时会抛出 IOException
。
3. 文件重命名与移动
fs.rename(
new Path("/xiyou/huaguoshan/sunwukong.txt"),
new Path("/xiyou/huaguoshan/meihouwang.txt")
);
功能扩展:
- 跨目录重命名可实现文件移动
- 目标路径必须不存在
4. 删除文件/目录
fs.delete(new Path("/xiyou"), true); // 递归删除目录
参数说明:
boolean recursive
:是否递归删除(目录非空时必须为true
)
5. 查看文件详情
RemoteIterator<LocatedFileStatus> listFiles = fs.listFiles(new Path("/"), true);
while (listFiles.hasNext()) {
LocatedFileStatus status = listFiles.next();
System.out.println("文件名:" + status.getPath().getName());
System.out.println("块大小:" + status.getBlockSize()); // 默认128MB
BlockLocation[] blocks = status.getBlockLocations(); // 获取块分布信息
}
关键元数据:
方法 | 返回值示例 | 说明 |
---|---|---|
getPermission() | rw-r--r-- | 文件权限 |
getReplication() | 3 | 副本数 |
getModificationTime() | 1625097600000 | 最后修改时间(毫秒时间戳) |
6. 判断文件/目录类型
FileStatus[] statusList = fs.listStatus(new Path("/"));
for (FileStatus status : statusList) {
if (status.isFile()) {
System.out.println(status.getPath() + " 是文件");
} else {
System.out.println(status.getPath() + " 是目录");
}
}
三、注意事项
1. 资源关闭
所有操作后必须调用 fs.close()
释放连接资源,推荐使用 try-with-resources
自动关闭:
try (FileSystem fs = FileSystem.get(...)) {
// 操作代码
} // 自动关闭
2. 路径规范
- 本地路径:Windows 使用
C:/path/file.txt
,Linux 使用/home/user/file.txt
- HDFS 路径:必须以
/
开头(如/data/file.txt
)
3. 异常处理
方法声明中需抛出 IOException
, URISyntaxException
等异常,或使用 try-catch
捕获:
try {
fs.copyFromLocalFile(...);
} catch (AccessControlException e) {
System.err.println("权限不足:" + e.getMessage());
}
四、操作示例总结
操作类型 | 核心方法 | 示例调用 |
---|---|---|
上传文件 | copyFromLocalFile() | fs.copyFromLocalFile(localPath, hdfsPath) |
下载文件 | copyToLocalFile() | fs.copyToLocalFile(false, hdfsPath, localPath, true) |
重命名文件 | rename() | fs.rename(oldPath, newPath) |
删除目录 | delete() | fs.delete(path, true) |
查看块分布 | getBlockLocations() | BlockLocation[] blocks = fileStatus.getBlockLocations() |
判断文件类型 | isFile() / isDirectory() | if (status.isFile()) { ... } |