HDFS的回收站功能可将删除的文件移动到用户.Trash目录(而非立即删除),便于恢复。
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 /user/username/.Trash/Current/deleted_file /path/to/restore
HDFS快照是文件系统在某一时刻的只读副本,可快速恢复数据。
hdfs dfsadmin -allowSnapshot /test # 允许目录创建快照
hdfs dfs -put test.txt /test # 向目录添加文件
hdfs fs -createSnapshot /test snapshot1 # 创建名为snapshot1的快照
hdfs fs -cp /test/.snapshot/snapshot1/test.txt /path/to/restore
Hadoop提供fsck(检查与修复)和DistCp(跨集群复制)工具,解决数据完整性问题。
fsck命令扫描文件系统,列出损坏的数据块并尝试修复:hdfs fsck / -files -blocks -locations # 检查根目录下的文件、数据块及位置
hdfs fsck / -delete # 删除无法修复的损坏数据块(谨慎使用)
DistCp从备份集群复制数据至当前集群:hadoop distcp hdfs://backup-cluster:8020/source/path hdfs://current-cluster:8020/restore/path
若自动恢复失败,可通过手动操作恢复元数据或数据块。
stop-dfs.sh # 停止HDFS集群
cp -r /path/to/secondary/namenode/data /path/to/namenode/data # 复制Secondary数据至Primary
start-dfs.sh # 启动HDFS集群
fsimage、edits文件)损坏,可从备份目录复制文件至NameNode数据目录:stop-dfs.sh
cp -r /path/to/backup/namenode/data/* /path/to/namenode/data/
start-dfs.sh
若上述方法均无效,可使用第三方工具恢复物理存储中的数据(需停止HDFS服务以避免数据覆盖)。
sudo yum install extundelete # 安装工具
sudo systemctl stop hadoop-hdfs-namenode # 停止HDFS服务
sudo umount /path/to/hdfs/directory # 卸载HDFS数据目录
sudo extundelete /path/to/hdfs/directory --restore-all # 恢复所有删除文件
sudo mount /path/to/hdfs/directory # 重新挂载目录
sudo yum install testdisk # 安装工具
sudo testdisk # 运行工具,按提示选择分区、扫描并恢复数据
DistCp跨集群复制)、启用快照功能(hdfs dfsadmin -createSnapshot)、设置合理的dfs.replication(数据块复制因子,默认3)可降低数据丢失风险。stop-dfs.sh),避免数据写入导致覆盖;恢复后使用hdfs dfsadmin -report检查集群状态,hdfs fsck /验证数据完整性。