从HDFS中删除文件并不能释放磁盘空间

8
在将我们的小型Cloudera Hadoop集群升级到CDH 5之后,删除文件不再释放可用存储空间。即使我们删除的数据比添加的数据多,文件系统仍在填充。
集群设置
我们在物理专用硬件上运行一个四节点集群,总存储容量约为110 TB。 4月3日,我们将CDH软件从5.0.0-beta2版本升级到版本5.0.0-1。
以前,我们通常以纯文本格式在hdfs上放置日志数据,速率约为700 GB /天。 4月1日,我们改为导入.gz文件的方式,每天摄入约130 GB的数据。
由于我们只想保留一定年龄的数据,因此每晚都有一个作业来删除过时的文件。 这样做的结果以前在hdfs容量监视图表中清楚可见,但现在已无法看到。
因为每天我们导入的数据比删除的数据少570 GB左右,所以人们会期望使用容量会下降。 但是自从升级集群软件以来,我们报告的hdfs使用情况一直在增长。
问题描述
运行“hdfs hadoop fs-du-h /”命令给出以下输出:
0       /system
1.3 T   /tmp
24.3 T  /user

这符合我们预期的结果,考虑到导入文件的大小。使用3个副本因子,这应该对应于大约76.8 TB的物理磁盘使用量。 当运行hdfs dfsadmin -report时,结果不同:
Configured Capacity: 125179101388800 (113.85 TB)
Present Capacity: 119134820995005 (108.35 TB)
DFS Remaining: 10020134191104 (9.11 TB)
DFS Used: 109114686803901 (99.24 TB)
DFS Used%: 91.59%
Under replicated blocks: 0
Blocks with corrupt replicas: 0
Missing blocks: 0

在这里,DFS使用量报告为99.24 TB ,这也是我们在监控图表中看到的。那么所有这些数据都来自哪里呢?

我们尝试过的方法

我们最初怀疑的是垃圾箱的自动清空功能未起作用,但事实并非如此。垃圾箱中只有最近删除的文件,并且它们会在一天后自动消失。

我们的问题似乎与执行 hdfs 元数据升级但未完成相关。我不认为在这些版本之间升级时需要这样做,但我还是执行了这两个步骤以“防患于未然”。

在 DN 存储卷的本地文件系统中,有很多数据存储在 `previous/finalized' 目录下。我对 hdsf 实现细节了解太少,无法确定是否具有重要意义,但这可能表明 finalization 中的某些内容不同步。

由于我们的集群即将耗尽磁盘空间,因此非常感谢任何帮助。

1个回答

13

我在我们的集群上发现了一个类似的问题,可能是由于升级失败引起的。

首先确保在namenode上完成升级。

hdfs dfsadmin -finalizeUpgrade

我发现的问题是,由于某些原因,数据节点根本没有完成它们的目录。

在您的数据节点上,您应该看到以下目录布局

/[mountpoint}/dfs/dn/current/{blockpool}/current

而且

/[mountpoint}/dfs/dn/current/{blockpool}/previous

如果您尚未完成,先前目录包含更新之前创建的所有数据。如果您删除任何内容,它不会被移除 - 因此您的存储空间永远不会减少。

实际上,最简单的解决方案就足够了。

重新启动namenode

查看datanode的日志,您应该会看到类似以下内容:

INFO org.apache.hadoop.hdfs.server.common.Storage: Finalizing upgrade for storage directory

接下来,目录将在后台被清除,存储空间将被回收利用。


1
谢谢!这似乎正是发生的事情。但仅仅重新启动名称节点并没有帮助。我们需要手动删除所有“_previous_”目录才能摆脱它们。 - knutn
非常有用的答案,我也遇到了同样的问题(从CDH4.7升级到CDH5.3)。为了补充Knuth的评论,hdfs需要花费一些时间(6-10小时)在所有数据节点上删除/previous目录,但我没有手动删除它们。 - Pixou
Pixou,您能否友好地提及自动删除这些目录的过程和您所采用的方法? - CodeReaper

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接