本文涵盖HDFS日常操作的完整指南,包含Shell命令实操和Java编程实现,适合Hadoop初学者、期末复习及大数据考研学子快速掌握分布式文件系统核心操作。
一、HDFS环境启动流程
在操作HDFS前需启动服务(确保Hadoop已安装配置):
cd hadoop # 进入Hadoop安装目录
cd sbin # 进入脚本目录
start-dfs.sh # 启动HDFS服务
jps # 检查进程(应有NameNode/DataNode)
cd .. # 返回上级目录
hdfs dfs -ls / # 查看根目录
# 通过浏览器访问管理界面
localhost:50070 # NameNode Web UI
二、HDFS六大核心操作(Shell命令)
1. 新建目录
hdfs dfs -mkdir -p /user/test_directory
-p
:自动创建父目录(类似Linux mkdir -p)
2. 修改目录名
hdfs dfs -mv /user/test_directory /user/renamed_directory
- HDFS的
mv
命令与Linux一致,用于重命名或移动
3. 删除目录
hdfs dfs -rm -r /user/renamed_directory
-r
:递归删除目录内容(删除目录必加参数)
4. 上传本地文件→HDFS
hdfs dfs -put /local/path/file.txt /user/hdfs/path/
put
也可用copyFromLocal
,二者功能相同
5. 下载HDFS文件→本地
hdfs dfs -get /user/hdfs/path/file.txt /local/path/
get
等价于copyToLocal
6. 删除HDFS文件
hdfs dfs -rm /user/hdfs/path/file.txt
- 删除单个文件无需
-r
参数
三、Java API实现六种操作
需添加Hadoop依赖(Maven配置):
<dependency> <groupId>org.apache.hadoop</groupId> <artifactId>hadoop-client</artifactId> <version>3.3.6</version> </dependency>
完整Java示例代码
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.*;
public class HDFSOperations {
public static void main(String[] args) throws Exception {
Configuration conf = new Configuration();
conf.set("fs.defaultFS", "hdfs://localhost:9000");
try (FileSystem fs = FileSystem.get(conf)) {
// 1. 创建目录
Path newDir = new Path("/user/test_directory");
fs.mkdirs(newDir);
System.out.println("目录创建成功: " + newDir);
// 2. 重命名目录
Path renamedDir = new Path("/user/renamed_directory");
fs.rename(newDir, renamedDir);
System.out.println("目录重命名为: " + renamedDir);
// 3. 删除目录
fs.delete(renamedDir, true); // true表示递归删除
System.out.println("目录已删除: " + renamedDir);
// 4. 上传本地文件
Path localFile = new Path("/local/path/file.txt");
Path hdfsFile = new Path("/user/hdfs/path/file.txt");
fs.copyFromLocalFile(localFile, hdfsFile);
System.out.println("文件上传至: " + hdfsFile);
// 5. 下载文件到本地
Path localDest = new Path("/local/path/download.txt");
fs.copyToLocalFile(hdfsFile, localDest);
System.out.println("文件下载至: " + localDest);
// 6. 删除HDFS文件
fs.delete(hdfsFile, false); // false表示删除文件
System.out.println("HDFS文件已删除: " + hdfsFile);
}
}
}
关键API解析
操作 | 核心方法 | 参数说明 |
---|---|---|
创建目录 | mkdirs(Path path) | 自动创建父目录 |
重命名/移动 | rename(Path src, Path dst) | 可跨目录操作 |
删除文件/目录 | delete(Path path, boolean recursive) | recursive=true递归删除目录 |
文件上传 | copyFromLocalFile(Path src, Path dst) | 源路径为本地文件系统 |
文件下载 | copyToLocalFile(Path src, Path dst) | 目标路径为本地文件系统 |
四、操作原理与注意事项
-
原子性保证
- HDFS的
rename
操作是原子的,适合用于数据写入完成后的发布 delete
操作立即删除元数据,实际数据块异步清理
- HDFS的
-
安全删除
hdfs dfs -rm -skipTrash /path/file # 跳过回收站直接删除
- 默认删除会进入回收站(
/user/<user>/.Trash
) - 生产环境慎用
-skipTrash
- 默认删除会进入回收站(
-
Java API最佳实践
- 使用
try-with-resources
确保FileSystem
资源释放 - 检查操作返回值(如
mkdirs
返回boolean表示是否成功) - 大文件上传使用
FSDataOutputStream
分块写入
- 使用
五、常见问题排查
-
权限拒绝错误
Permission denied: user=root, access=WRITE, inode="/"
解决方案:
hdfs dfs -chmod 777 /user # 临时方案 # 或在hdfs-site.xml中设置dfs.permissions.enabled=false
-
文件已存在错误
- 上传文件前检查目标路径是否存在:
if (fs.exists(hdfsFile)) { fs.delete(hdfsFile, false); }
-
空间不足问题
- 检查HDFS空间使用:
hdfs dfsadmin -report
总结:掌握HDFS操作是大数据开发的基础能力。Shell命令适合快速操作,Java API则是开发分布式应用的核心。理解底层原理(如数据分块存储、副本机制)能帮助开发者更高效地使用HDFS。