在 Ubuntu 上恢复 HDFS 数据的实用流程
一、先判断故障类型与影响
- 查看集群整体健康与容量:hdfs dfsadmin -report,确认 DataNode 数量、可用容量与 Under-Replicated 块数。
- 快速定位异常:查看 NameNode/DataNode 日志(默认在 $HADOOP_LOG_DIR,常见路径如 /path/to/hadoop/logs/hadoop--namenode-.log)。
- 检查文件系统一致性:hdfs fsck / -files -blocks -locations,识别缺失或损坏块。
- 若 NameNode 卡在 SafeMode:先排查原因,必要时执行 hdfs dfsadmin -safemode leave 退出安全模式(仅在确认元数据无大碍时)。
- 如 DataNode 宕机,HDFS 会自动从副本恢复冗余,确认磁盘与目录无损坏后再启动 DataNode。
二、按场景选择恢复路径
- 误删文件且回收站已启用
- 确认回收站开关:在 core-site.xml 中设置
- fs.trash.interval(分钟,0 为关闭,建议如 1440)
- fs.trash.checkpoint.interval(分钟,建议与上式相同或更小)
- 查找并恢复:文件通常位于 /user/<用户名>/.Trash/Current/,执行
- 预览:hdfs dfs -ls /user/<用户名>/.Trash/Current/
- 恢复:hdfs dfs -mv /user/<用户名>/.Trash/Current/<原路径> /目标恢复路径
- 已配置快照的目录
- 允许快照:hdfs dfsadmin -allowSnapshot
- 查看快照:hdfs dfs -listSnapshottableDir;对比差异:hdfs snapshotDiff
- 恢复方式一(推荐,不覆盖现有):hdfs dfs -cp /.snapshot/<snapshot_name>/<文件或目录> <恢复路径>
恢复方式二(就地回滚):hdfs dfs -restoreSnapshot <snapshot_name>
- 块丢失或副本不足
- 检查并修复:hdfs fsck / -files -blocks -locations
- 对“卡住”的租约或文件尝试恢复:hdfs debug recoverLease /path/to/file -retries 3
- 观察 Under-Replicated Blocks 是否逐步回到目标副本数(由 dfs.replication 决定)。
- 从备份或远端集群恢复
- 使用 DistCp 跨集群/跨存储恢复:
- 远端 HDFS:hadoop distcp hdfs://namenode1:8020/source/path hdfs://namenode2:8020/dest/path
- 本地/NFS/SFTP 等:先挂载或可达,再用 DistCp 指向对应路径
- 若通过管理面(如 FusionInsight Manager)执行恢复,注意:恢复期间会短暂停止用户认证;恢复点之后的新数据会丢失;不要对 YARN 运行目录(如 /tmp/logs、/tmp/archived、/tmp/hadoop-yarn/staging)执行恢复,否则 DistCp 可能失败。
- 元数据级灾难恢复(无回收站/快照/备份时的最后手段)
- 准备最近可用的 fsimage 与 edits(或 Checkpoint)
- 停止集群,按官方流程恢复 NameNode 元数据(加载 fsimage、回放 edits),再启动;此过程需严格按版本与操作步骤执行。
三、常用命令速查表
| 场景 |
关键命令 |
| 集群健康 |
hdfs dfsadmin -report |
| 一致性检查 |
hdfs fsck / -files -blocks -locations |
| 租约/块恢复 |
hdfs debug recoverLease /path -retries 3 |
| 回收站恢复 |
hdfs dfs -mv /user//.Trash/Current/<原路径> <恢复路径> |
| 快照恢复(不覆盖) |
hdfs dfs -cp /.snapshot//<文件或目录> <恢复路径> |
| 快照回滚(就地) |
hdfs dfs -restoreSnapshot |
| 跨集群恢复 |
hadoop distcp hdfs://src:8020/a hdfs://dst:8020/b |
以上命令适用于 Ubuntu 上的标准 Apache Hadoop 环境,路径与端口可按实际配置调整。
四、恢复前后关键注意事项
- 恢复窗口与一致性:在业务低峰期执行;恢复会使备份点之后的数据丢失,必要时先做最新备份。
- 避免恢复至运行目录:不要覆盖 /tmp/logs、/tmp/archived、/tmp/hadoop-yarn/staging 等 YARN 临时目录,防止任务失败。
- 回收站开关:若 fs.trash.interval=0,删除即永久删除,无法走回收站恢复。
- 快照前提:目录需先执行 hdfs dfsadmin -allowSnapshot 才可创建快照。
- 版本与元数据:跨版本恢复风险高;元数据恢复务必按官方步骤,先停集群、备份现有元数据目录后再操作。
- 验证:恢复后用 hdfs dfs -ls /目标路径、hdfs fsck 校验文件与块完整性。
五、预防与加固建议
- 启用并定期验证回收站:设置 fs.trash.interval 与 fs.trash.checkpoint.interval(如 1440 分钟)。
- 为关键目录启用快照策略:周期性创建快照,结合 snapshotDiff 做差异审计与快速回滚。
- 建立定期备份与异地/跨集群复制:用 DistCp 做周期性全量/增量备份,或配置跨集群复制。
- 配置 HDFS HA(Active/Standby + JournalNode)降低 NameNode 单点风险。
- 监控与演练:监控 Under-Replicated、Corrupt Blocks 等指标;定期在测试环境演练恢复流程。