You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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的定期扫描任务识别,会一直占用磁盘空间,不会被自动释放。
空间释放操作步骤

按以下顺序操作,可彻底回收可用空间:

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

内容的提问来源于stack exchange,提问作者Cesar Manrique

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.31 01:04:07