EMR集群HDFS为何存在大量未使用不可用空间?如何释放?
问题根因
HDFS空间统计差值大、删除文件后空间不释放是EMR集群运维的高频问题,核心原因有4类:
- 回收站机制拦截删除操作:默认配置下执行
hdfs dfs -rm删除的文件不会被立刻清除,会转移到对应用户目录下的.Trash文件夹,保留周期默认7天,这部分文件仍然占用完整的HDFS块空间。 - HDFS快照保留历史块:如果业务目录(尤其是Spark checkpoint、日志存储目录)开启了HDFS快照,删除快照范围内的文件时,对应块会被保留给快照做版本回溯,不会被释放,除非删除对应快照。
- 非HDFS文件占用专属分区:
hdfs dfs -df和hdfs dfsadmin -report统计的是数据盘的整体磁盘使用率,不是仅统计HDFS存储的文件大小。HDFS专属分区上通常还会存放YARN容器日志、Spark Shuffle临时文件、NodeManager本地缓存、系统运行日志等非HDFS管理的文件,这部分占用不会因为你删除HDFS上的文件减少。另外DataNode会通过dfs.datanode.du.reserved配置为非HDFS进程预留固定空间,这部分空间会被统计为HDFS不可用。这是出现数百GB空间统计差值的最常见原因。 - 无效块未被及时回收:写入中断的损坏块、HDFS升级遗留的旧版本块、块复制产生的临时块如果没有被DataNode的定期扫描任务识别,会一直占用磁盘空间,不会被自动释放。
空间释放操作步骤
按以下顺序操作,可彻底回收可用空间:
- 清理回收站残留
先统计所有用户的回收站占用:
确认无需要恢复的文件后,跳过回收站彻底删除回收站内容:hdfs dfs -du -h -s /user/*/.Trashhdfs dfs -rm -r -skipTrash /user/*/.Trash/* - 清理无用HDFS快照
先列出集群所有开启快照的目录:
进入对应快照目录,确认无保留需求的历史快照直接删除,删除后快照关联的块会被自动释放:hdfs lsSnapshottableDir# 查看目录下所有快照 hdfs dfs -ls <快照目录路径>/.snapshot # 删除指定快照 hdfs dfs -deleteSnapshot <快照目录路径> <快照名称> - 清理数据盘上的非HDFS占用文件
登录空间异常的节点,找到HDFS数据盘挂载路径(EMR默认挂载点为/mnt/disk1、/mnt/disk2这类格式),逐盘排查非HDFS目录的占用:
重点清理以下几类非HDFS文件(这类文件不属于HDFS管理,直接在操作系统层面删除即可,不会影响HDFS数据):# 进入数据盘根目录执行,查看各子目录大小 du -sh * --max-depth=1yarn/nm-local-dir下超过7天的Shuffle临时文件、已结束容器的缓存文件spark/work下超过7天的Spark任务临时文件、旧事件日志- 挂载在数据盘上的系统日志、审计日志历史文件
同时核对dfs.datanode.du.reserved配置值,单盘预留空间建议设置为10GB~20GB即可,如果配置值过大(比如单盘预留超过50GB)可以适当调小,重启DataNode后生效。
- 触发无效块回收
先扫描集群损坏块、无效块情况:
手动触发异常节点的块汇报,让DataNode重新扫描磁盘上的有效块,清理残留无效块:hdfs fsck / -list-corruptfileblocks
如果集群之前做过HDFS版本升级且确认无回滚需求,可以执行升级收尾操作,删除旧版本遗留的块数据:hdfs dfsadmin -triggerBlockReport <异常节点DataNode的地址:IPC端口>hdfs dfsadmin -finalizeUpgrade - 验证效果
所有操作执行完成后等待5~10分钟,等待所有DataNode完成块汇报后,重新执行hdfs dfs -df -h和hdfs dfsadmin -report核对容量,正常情况下两个命令的容量差值应该在5%以内(预留空间+少量运行中临时文件的正常误差),之前缺失的空间会转为可用。
注意事项
- 不要手动删除DataNode数据目录下
current/BP-开头的块池文件,这类文件是HDFS存储的有效数据块,误删会导致数据丢失。 - 日常运维可以配置自动清理策略:设置合理的回收站保留周期、定期清理过期快照、配置YARN/Spark日志自动过期删除,避免出现空间突增的问题。
- 删除HDFS文件时如果需要立刻释放空间,必须加
-skipTrash参数,否则文件会在回收站留存到过期才会被真正删除。
内容的提问来源于stack exchange,提问作者Cesar Manrique
相关产品推荐
相关产品推荐

