一、 HDFS 到底是干嘛的?
简单来说,HDFS 就是一个超级硬盘。
1. 核心痛点:单机存不下
你买一台顶配的服务器,硬盘撑死也就几十 TB。但互联网大厂每天产生的数据可能有 PB 级(1PB = 1024TB)。物理上没有这么大的单块硬盘,怎么办?
HDFS 的思路: 既然一块硬盘存不下,那我就把 1000 台机器的硬盘连起来,用软件伪装成"一块超大硬盘"。
2. 用户视角:像用 Linux 一样用 HDFS
对使用者来说,你感觉不到底层有 1000 台机器。你看到的文件路径长这样:
hdfs://namenode:8020/user/data/log.txt
操作起来和 Linux 本地文件系统几乎一模一样(ls, cp, rm)。
3. 三大特性(复习一下)
- 分块存储 (Block):文件被切成 128MB 一块(默认)。
- 多副本 (Replication):每一块默认存 3 份,坏了两台机器数据也不丢。
- 流式数据访问 :一次写入,多次读取。不支持修改文件中间的内容(只能追加或覆盖)。
二、 HDFS Shell 指令体系:从入门到精通
HDFS 的命令行工具是我们在日常开发、运维中最常用的交互方式。
指令格式:
bash
# 写法 A (推荐,语义更清晰)
hdfs dfs -指令 参数
# 写法 B (老版本写法,完全通用)
hadoop fs -指令 参数
注:以下演示均使用 hdfs dfs 前缀。
1. 这里的"增"------上传与创建
这是数据进湖的第一步。
-
mkdir:创建目录bash# 在 HDFS 根目录下创建 input 文件夹 hdfs dfs -mkdir /input # 级联创建(类似 Linux) hdfs dfs -mkdir -p /user/hive/warehouse -
put:上传文件(最常用)将**本地系统(Linux)**的文件上传到 HDFS。
bash# 语法:hdfs dfs -put <本地路径> <HDFS路径> # 将本地的 data.txt 传到 HDFS 的 /input 目录下 hdfs dfs -put ./data.txt /input/ # 如果目标文件已存在,强制覆盖 (使用 -f) hdfs dfs -put -f ./data.txt /input/ -
copyFromLocal:从本地复制功能和
put一模一样。put其实是copyFromLocal的简写。 -
moveFromLocal:从本地移动上传后,把本地源文件删掉(剪切操作)。
bashhdfs dfs -moveFromLocal ./large_log.log /backup/ -
appendToFile:追加内容因为 HDFS 不支持随机修改,但支持追加。
bash# 把本地的 2.txt 的内容接到 HDFS 上 1.txt 的屁股后面 hdfs dfs -appendToFile ./2.txt /input/1.txt
2. 这里的"查"------查看与列出
-
ls:列出文件bash# 列出根目录下的文件 hdfs dfs -ls / # 递归列出所有子文件(类似 Linux 的 -R) hdfs dfs -ls -R / -
cat:查看文件内容
注意: 千万别对几百 GB 的大文件用这个,终端会炸。适合看小配置文件。bashhdfs dfs -cat /input/config.xml -
tail:查看文件末尾bash# 查看最后 1KB 的内容 hdfs dfs -tail /input/big_log.log -
du:查看空间占用(运维必会)bash# 查看 /input 目录下各文件的大小 hdfs dfs -du -h /input # 查看 /input 目录的总大小(汇总) hdfs dfs -du -s -h /input
3. 这里的"删"与"改"------下载与维护
-
get:下载文件将 HDFS 的文件下载回本地 Linux。
bash# 语法:hdfs dfs -get <HDFS路径> <本地路径> # 把 HDFS 上的 result.csv 下载到当前目录 hdfs dfs -get /output/result.csv ./ -
getmerge:合并下载(神器)MapReduce 或 Spark 跑完后,结果通常是散落在多个小文件里的(如
part-00000,part-00001)。这个命令能把目录下的所有碎片文件合并成一个本地文件下载下来。
bash# 把 /output 目录下的所有 part 文件合并成 local_complete.txt hdfs dfs -getmerge /output/ ./local_complete.txt -
cp:HDFS 内部复制bashhdfs dfs -cp /input/data.txt /backup/data.txt.bak -
mv:HDFS 内部移动/重命名bash# 移动 hdfs dfs -mv /input/data.txt /archive/ # 重命名 hdfs dfs -mv /input/data.txt /input/data_new.txt -
rm:删除文件
高危操作!bash# 删除文件 hdfs dfs -rm /input/error_log.txt # 递归删除目录(删除文件夹必加 -r) hdfs dfs -rm -r /output_temp # 跳过回收站直接彻底删除(慎用!无法恢复) hdfs dfs -rm -r -skipTrash /output_temp -
chmod / chown:权限管理和 Linux 一模一样。
bash# 修改权限为 777 hdfs dfs -chmod 777 /user/data # 修改拥有者 hdfs dfs -chown hive:hive /user/hive/warehouse
三、 高阶知识点:回收站与 Block 大小
在面试或实际工作中,有两个细节非常重要。
1. HDFS 的回收站机制 (Trash)
你在 HDFS 上执行 rm,文件真的没了吗?
- 默认配置 :如果开启了回收站(通常生产环境都会开),
rm并不是物理删除,而是mv到了/user/用户名/.Trash/Current目录下。 - 恢复方法 :如果你手滑删库了,赶紧去
.Trash目录把文件mv出来,还能救命。 - 自动清理:系统会设置一个过期时间(比如 7 天),超过这个时间,Trash 里的文件才会被真正删除。
2. 为什么 Block 默认是 128MB?
Linux 本地文件系统的块才几 KB,为什么 HDFS 要搞这么大?
- 是为了最小化寻址开销。
- 如果块太小(比如 1MB),那存 100TB 数据会产生海量的块,NameNode 的内存会被元数据撑爆。
- 同时,块越大,硬盘读取时的顺序读取比例越高(磁头不用到处跳),速度就越快。但也不能无限大,太大了会导致并行度降低。128MB 或 256MB 是一个权衡后的最佳值。
四、 总结:HDFS 操作速查表
| 场景 | 关键指令 | 备注 |
|---|---|---|
| 我要把数据传上去 | put, copyFromLocal |
moveFromLocal 会删除本地源文件 |
| 我要把数据拿下来 | get, copyToLocal |
getmerge 可以合并下载碎片文件 |
| 我看一眼这啥文件 | cat, tail, ls |
大文件别用 cat |
| 我要清理空间 | rm -r |
默认进回收站,-skipTrash 彻底删除 |
| 这文件多大? | du -h |
-s 参数可以看汇总大小 |
| 文件操作 | cp, mv, mkdir |
用法同 Linux |
掌握了这些指令,你就拥有了操作 PB 级数据的"遥控器"。无论是作为开发人员上传 Jar 包、检查计算结果,还是作为运维人员管理存储空间,这都是最基本也是最硬核的技能。