截断HBase表未释放HDFS存储空间的问题该如何解决
HBase执行truncate操作后,数据不会立即从HDFS物理删除,仅会标记为待删除状态,相关文件会先移入HBase归档目录或HDFS回收站,因此会出现短时间内空间占用反而上升的情况,可通过以下方案释放空间:
1. 清理HDFS回收站
HDFS默认开启回收站机制,删除的文件会保留fs.trash.interval参数配置的时长(默认360分钟),到期后才会自动释放。可手动执行命令立即清空回收站释放空间:hdfs dfs -expunge
如果仅需清理HBase相关的回收站文件,可针对性删除对应路径:hdfs dfs -rm -r -skipTrash /user/[用户名]/.Trash/Current/hbase
2. 清理HBase归档与无效文件
HBase删除/截断表生成的旧HFile会默认存放在/hbase/archive目录下,不会自动清理。确认无需恢复旧数据后可直接清理该目录:hdfs dfs -rm -r -skipTrash /hbase/archive/*
之后对剩余的HBase表强制执行Major Compaction,清理带有删除标记的无效KV数据:
hbase shell major_compact '你的表名'
单节点部署可直接全量执行,多节点建议在业务低峰期操作,避免影响读写性能。
3. 调整HDFS副本数
单节点部署的HDFS无需配置多副本,默认3副本会浪费2/3的存储空间。可递归修改HBase目录下所有文件的副本数为1:hdfs dfs -setrep -R 1 /hbase
如果是多节点集群,也可根据可用性需求将副本数从默认3调整为2,可直接释放约1/3的HBase占用空间。
4. 调整HDFS预留空间配置
HDFS默认会预留5%的磁盘空间给系统其他进程使用,对应配置项为dfs.datanode.du.reserved。如果该节点仅部署HDFS与HBase服务,可适当调低预留比例(建议不低于1%),在Ambari的HDFS配置页修改该参数后重启DataNode即可生效。注意不要将预留空间调至0,避免磁盘占满导致服务进程崩溃。
5. 清理HDFS其他无效文件
排查HDFS上非HBase的冗余文件,常见可清理路径包括:
/tmp目录下的过期临时文件- 历史任务(MapReduce/Spark/Flink)残留的日志、输出文件
- 未使用的备份文件、旧版本安装包
可通过hdfs dfs -du -h /命令查看根目录下各路径的空间占用,定位大文件确认无用后删除。
所有操作执行完成后,执行hdfs dfs -df -h查看HDFS整体空间使用率即可,无需依赖本地du命令统计(本地磁盘统计会包含HDFS已标记删除但未实际清理的文件,存在延迟)。
内容的提问来源于stack exchange,提问作者user3091996

