HDFS的回收站功能可将删除的文件移动至用户目录下的.Trash/Current文件夹(而非立即永久删除),便于快速恢复。
core-site.xml配置文件,添加以下参数并重启HDFS集群:<property>
<name>fs.trash.interval</name>
<value>120</value> <!-- 回收站保留时间(分钟),设为0则禁用 -->
</property>
<property>
<name>fs.trash.checkpoint.interval</name>
<value>120</value> <!-- 回收站检查点间隔(分钟) -->
</property>
/user/username/.Trash/Current/路径下,使用hdfs dfs -cp命令复制回原路径即可:hdfs dfs -cp /user/username/.Trash/Current/deleted_file /path/to/original/location
HDFS快照是文件系统在某一时刻的只读副本,可快速还原到指定时间点的状态。
hdfs dfsadmin -allowSnapshot /target_directory # 允许目标目录创建快照
hdfs dfs -createSnapshot /target_directory snapshot_name # 创建快照(如snapshot_202510)
hdfs dfs -cp /target_directory/.snapshot/snapshot_name/deleted_file /path/to/restore
HDFS提供fsck(文件系统检查)和DistCp(跨集群复制)工具,用于检查和修复数据问题。
hdfs fsck命令扫描文件系统,列出损坏的数据块及其位置:hdfs fsck / -files -blocks -locations # 检查根目录下所有文件的块状态
fsck发现损坏块,可使用recoverLease命令尝试修复(需指定数据块路径):hdfs debug recoverLease /path/to/corrupt/block -retries 3 # 重试3次修复
DistCp从其他集群或备份路径复制数据:hadoop distcp hdfs://source-cluster:8020/source_path hdfs://target-cluster:8020/target_path # 跨集群复制
若上述方法均无效,可尝试手动恢复元数据或数据块(需谨慎操作,避免二次损坏)。
stop-dfs.sh # 停止HDFS服务
cp -r /path/to/secondarynamenode/data/* /path/to/namenode/data/ # 复制元数据
start-dfs.sh # 启动HDFS服务
DistCp或第三方工具备份的NameNode元数据、DataNode数据),可将备份数据复制到对应目录并重启集群。若HDFS原生工具无法满足需求,可使用第三方工具(如extundelete、testdisk)恢复底层文件系统中的数据(需停止HDFS服务以避免数据覆盖)。
sudo yum install extundelete # 安装工具
sudo systemctl stop hadoop-hdfs-namenode hadoop-hdfs-datanode # 停止HDFS服务
sudo umount /path/to/hdfs/data # 卸载数据目录
sudo extundelete /path/to/hdfs/data --restore-all # 恢复所有删除文件
sudo mount /path/to/hdfs/data # 重新挂载目录
sudo yum install testdisk # 安装工具
sudo testdisk # 运行工具,按提示选择分区、扫描并恢复数据