温馨提示×

HDFS快照如何使用

小樊
34
2025-12-14 15:03:30
栏目: 编程语言

HDFS 快照使用指南

一 核心概念与适用场景

  • HDFS 快照是文件系统在某一时刻的只读副本,用于备份误操作回滚。其实现具备以下特性:
    • 创建是瞬时的:时间复杂度 O(1)(不含 INode 查找)。
    • 仅当修改与快照相关的数据时才会额外占用内存:内存复杂度 O(M)(M 为被修改的文件/目录数)。
    • 不复制 DataNode 数据块:快照只记录块列表与文件大小
    • 常规 HDFS 操作不受影响:修改按时间倒序记录,可直接访问当前最新数据。
  • 典型场景:重要目录的时间点备份误删恢复、变更前后差异对比审计

二 前置条件与限制

  • 目录需先被设置为可快照目录(snapshottable)才能创建快照。
  • 一个可快照目录最多容纳 65,536 个快照;可快照目录的数量无限制
  • 不允许级联:若某目录的父目录或子目录已是可快照目录,则该目录不能再设为可快照。
  • 对可快照目录:在删除所有快照之前既不能删除也不能重命名该目录。
  • 快照访问路径使用保留后缀 /.snapshot,例如:若 /foo 为可快照目录且有快照 s0,则 /foo/.snapshot/s0/bar 表示 /foo/bar 在 s0 时刻的只读副本。

三 常用命令速查

  • 管理员操作(需超级用户)
    • 允许快照:hdfs dfsadmin -allowSnapshot <path>
    • 禁止快照:hdfs dfsadmin -disallowSnapshot <path>(需先删除该目录下全部快照)
  • 用户操作
    • 创建快照:hdfs dfs -createSnapshot <path> [snapshotName](省略名称时自动生成形如 sYYYYMMDD-HHmmss.SSS 的时间戳)
    • 删除快照:hdfs dfs -deleteSnapshot <path> <snapshotName>
    • 重命名快照:hdfs dfs -renameSnapshot <path> <oldName> <newName>
    • 列出可快照目录:hdfs lsSnapshottableDir
    • 快照差异报告:hdfs snapshotDiff <path> <fromSnapshot> <toSnapshot>(支持用 . 表示当前状态)
  • 快照访问与恢复
    • 列出快照内容:hdfs dfs -ls <snapshottablePath>/.snapshot/<snapshotName>
    • 从快照拷贝恢复:hdfs dfs -cp -ptopax <snapshottablePath>/.snapshot/<snapshotName>/<subPath> <targetPath>-ptopax 保留时间戳、属主、权限、ACL、XAttrs)

四 完整示例 备份与恢复

  • 1)开启快照
    • hdfs dfsadmin -allowSnapshot /data/important
  • 2)创建快照
    • hdfs dfs -createSnapshot /data/important backup_20251214
  • 3)误删后从快照恢复
    • hdfs dfs -rm -r /data/important/conf
    • hdfs dfs -cp -ptopax /data/important/.snapshot/backup_20251214/conf /data/important/
  • 4)对比快照差异
    • hdfs snapshotDiff /data/important backup_20251214 .
  • 5)清理与关闭
    • hdfs dfs -deleteSnapshot /data/important backup_20251214
    • hdfs dfsadmin -disallowSnapshot /data/important
  • 说明
    • 差异符号含义:+ 创建、- 删除、M 修改、R 重命名(同可快照目录内);跨目录重命名会被分别报告为删除与创建。

五 在 OSS-HDFS 中使用快照

  • OSS-HDFS 兼容 HDFS 接口,快照用法基本一致,但开启/关闭快照需使用 JindoSDK 的管理命令:
    • 开启:jindo admin -allowSnapshot -dlsUri oss://<bucket>.<endpoint>/<path>
    • 创建:hdfs dfs -createSnapshot oss://<bucket>.<endpoint>/<path> <snapName>
    • 访问:hdfs dfs -ls oss://<bucket>.<endpoint>/<path>/.snapshot/<snapName>/<subPath>
    • 恢复:hdfs dfs -cp oss://<bucket>.<endpoint>/<path>/.snapshot/<snapName>/<subPath> oss://<bucket>.<endpoint>/<path>
    • 差异:jindo admin -snapshotDiff -dlsUri oss://<bucket>.<endpoint>/<path> -fromSnapshot <s1> -toSnapshot <s2>
    • 关闭:jindo admin -disallowSnapshot -dlsUri oss://<bucket>.<endpoint>/<path>(需先删除全部快照)
  • 要求与提示
    • JindoData 4.0.0 及以上;部分环境建议使用 JindoSDK 4.5.0 及以上并正确配置 AccessKey/Endpoint

0