在 Linux 环境下使用 HDFS(Hadoop Distributed File System) 出现“丢数据”的情况,通常不是 HDFS 本身主动丢失数据,而是由配置、运维、异常或误用导致的。下面按常见原因系统说明:
dfs.replication=31 或 0,节点宕机就会丢数据检查:
hdfs dfs -stat %r /path/file
配置:
<property>
<name>dfs.replication</name>
<value>3</value>
</property>
✅ 节点数 ≥ 副本数
检查:
jps
df -h
rm -rf 了 DataNode 数据目录默认目录:
dfs.datanode.data.dir
⚠️ 删除该目录 = 直接丢块
常见错误代码:
FSDataOutputStream out = fs.create(path);
out.write(...);
// 忘记 out.close();
结果:
✅ 必须 close() 或 hflush()/hsync()
-append 或流式写入异常中断hdfs dfs -rm -r /user/data
<property>
<name>fs.trash.interval</name>
<value>0</value>
</property>
✅ 建议开启:
<value>1440</value> <!-- 1天 -->
dfs.namenode.name.dir 损坏fsimage后果:
✅ 建议:
检查:
hdfs fsck / -list-corruptfileblocks
| 原因 | 说明 |
|---|---|
| 磁盘只读 | mount -o ro |
| inode 满 | df -i |
| 文件句柄耗尽 | ulimit -n |
| 时间不同步 | NTP 未开 |
# 1. 检查副本
hdfs dfs -stat %r /path
# 2. 检查损坏块
hdfs fsck / -list-corruptfileblocks
# 3. 检查 DataNode
jps
hdfs dfsadmin -report
# 4. 检查配置
dfs.replication
fs.trash.interval
dfs.datanode.data.dir
HDFS 不会“莫名丢数据”,99% 的“丢数据”是:副本不足、节点故障、误删、写入未关闭或磁盘问题。
如果你愿意,可以告诉我:
我可以帮你精准定位原因。