HDFS Snapshot 使用指南
更新时间:2026-07-01
HDFS Snapshot(快照)用于保存 HDFS 目录在某一时刻的只读副本,适合用于数据备份、误删除恢复、变更前留档等场景。快照不会复制 DataNode 上的数据块,创建速度快,占用空间主要来自快照后发生变更的数据。
适用场景
- 重要数据目录变更前保留恢复点。
- 防止业务误删、误改 HDFS 文件。
- 在升级、迁移、批量任务执行前保存目录状态。
- 对比目录在两个时间点之间的文件变化。
使用限制
- 只有被设置为可快照的目录才能创建快照。
- 一个可快照目录最多支持 65,536 个快照。
- 可快照目录不能嵌套设置,例如
/data已开启快照能力后,不能再对/data/app开启快照能力。 - 目录下存在快照时,不能删除或重命名该可快照目录;需要先删除该目录下的全部快照。
- 快照是只读副本,不能直接修改快照中的文件。
基本流程
使用 HDFS Snapshot 通常分为三步:
- 管理员为目标目录开启快照能力。
- 用户在该目录上创建快照。
- 用户通过
.snapshot路径查看、恢复或对比快照内容。
开启目录快照能力
管理员执行以下命令,将目录设置为可快照目录:
Bash
1hdfs dfsadmin -allowSnapshot <path>
示例:
Bash
1hdfs dfsadmin -allowSnapshot /user/project/data
开启后,用户可以在该目录上创建快照。
创建快照
创建快照命令如下:
Bash
1hdfs dfs -createSnapshot <path> [snapshotName]
snapshotName 可选。如果不指定,HDFS 会自动生成快照名称。
示例:
Bash
1hdfs dfs -createSnapshot /user/project/data before_upgrade
创建完成后,可以通过以下路径访问快照内容:
Bash
1/user/project/data/.snapshot/before_upgrade
查看快照
列出目录下已有快照:
Bash
1hdfs dfs -ls /user/project/data/.snapshot
查看指定快照中的文件:
Bash
1hdfs dfs -ls /user/project/data/.snapshot/before_upgrade
查看快照中的某个文件:
Bash
1hdfs dfs -cat /user/project/data/.snapshot/before_upgrade/example.txt
从快照恢复数据
快照本身不能修改,但可以从快照路径复制文件或目录到目标位置。
恢复单个文件:
Bash
1hdfs dfs -cp /user/project/data/.snapshot/before_upgrade/example.txt /user/project/data/example.txt
恢复目录:
Bash
1hdfs dfs -cp /user/project/data/.snapshot/before_upgrade/app /user/project/data/app
如需尽量保留文件属性,可以使用 -p 参数。例如保留时间、权限、属主、ACL、XAttrs 等属性:
Bash
1hdfs dfs -cp -ptopax /user/project/data/.snapshot/before_upgrade/app /user/project/data/app
对比快照差异
可以使用 snapshotDiff 对比两个快照之间的差异,也可以对比某个快照和当前目录状态的差异。
命令格式:
Bash
1hdfs snapshotDiff <path> <fromSnapshot> <toSnapshot>
对比两个快照:
Bash
1hdfs snapshotDiff /user/project/data before_upgrade after_upgrade
对比快照和当前目录状态,使用 . 表示当前状态:
Bash
1hdfs snapshotDiff /user/project/data before_upgrade .
常见差异标记含义如下:
| 标记 | 含义 |
|---|---|
+ |
新增文件或目录 |
- |
删除文件或目录 |
M |
文件或目录被修改 |
R |
文件或目录被重命名 |
重命名快照
如需调整快照名称,可以执行:
Bash
1hdfs dfs -renameSnapshot <path> <oldName> <newName>
示例:
Bash
1hdfs dfs -renameSnapshot /user/project/data before_upgrade backup_20260617
删除快照
不再需要某个快照时,可以删除快照释放对应的元数据和可回收空间:
Bash
1hdfs dfs -deleteSnapshot <path> <snapshotName>
示例:
Bash
1hdfs dfs -deleteSnapshot /user/project/data before_upgrade
删除快照不会删除当前目录中的正常文件,只会删除该快照记录。
关闭目录快照能力
管理员可以关闭目录的快照能力:
Bash
1hdfs dfsadmin -disallowSnapshot <path>
示例:
Bash
1hdfs dfsadmin -disallowSnapshot /user/project/data
关闭前需要先删除该目录下的全部快照,否则命令会失败。
查看可快照目录
查看当前用户有权限访问的可快照目录:
Bash
1hdfs lsSnapshottableDir
该命令可用于确认哪些目录已经开启快照能力。
使用建议
- 在重要变更前创建快照,并使用有业务含义的名称,例如
before_upgrade、before_delete、backup_20260617。 - 定期清理不再需要的快照,避免长期保留过多历史版本。
- 恢复数据前,先通过
hdfs dfs -ls或hdfs snapshotDiff确认快照内容。 - 对关键生产目录执行删除、覆盖、批量迁移前,建议先创建快照。
- 快照不是跨集群容灾方案;如需应对集群级故障,应结合异地备份或数据同步能力。
评价此篇文章
