HDFS块大小与实际文件大小

17
我知道HDFS使用数据节点中的常规Linux文件系统存储数据。我的HDFS块大小为128 MB。假设我的hadoop集群有10 GB的磁盘空间,这意味着HDFS最初有80个可用存储块。
如果我创建一个小文件,比如12.8 MB,可用的HDFS块将变为79。如果我再创建另一个12.8 MB的小文件会发生什么?可用块数量会保持在79还是降到78?在前一种情况下,HDFS基本上会根据可用的空闲磁盘空间在每个块分配后重新计算可用的块数,因此只有在消耗了超过128 MB的磁盘空间后,可用的块数才会变为78。请澄清一下。
4个回答

24

最好的方法是尝试一下,看看我的结果如下。

但在尝试之前,我猜想即使您的配置只能分配80个完整块,您也可以分配更多的非空文件。这是因为我认为HDFS在分配非空文件时不会每次使用一个完整块。换句话说,HDFS块不是一个存储分配单元,而是一个复制单元。我认为HDFS的存储分配单元是底层文件系统的单元(如果您在具有4 KB块大小的ext4中创建1 KB文件,并在副本系数为3的集群中,则消耗3倍4 KB = 12 KB的硬盘空间)。

足够猜测和思考了,让我们来试试吧。我的实验室配置如下:

  • hadoop版本1.0.4
  • 4个数据节点,每个节点可用空间略小于5.0G,ext4块大小为4K
  • 块大小为64 MB,默认副本为1

启动HDFS后,我有以下NameNode摘要:

  • 1 个文件和目录,0 个块 = 1 总数
  • DFS 已使用:112 KB
  • DFS 剩余:19.82 GB

然后我执行以下命令:

  • hadoop fs -mkdir /test
  • for f in $(seq 1 10); do hadoop fs -copyFromLocal ./1K_file /test/$f; done

得到以下结果:

  • 12 个文件和目录,10 个块 = 22 总数
  • DFS 已使用:122.15 KB
  • DFS 剩余:19.82 GB

因此这 10 个文件没有消耗 10 倍的 64 MB("DFS 剩余" 没有修改)。


这就是我猜测的内容。现在更清晰了。感谢详细的解释和实验! - NPE

1
HDFS仅在本地文件系统上使用所需内容。因此,代表12 MB文件的块将在存储时占用12 MB(存储在每个数据节点上)。 因此,假设您有足够的数据空间,您将能够拥有所需数量的块。

1
但我认为HDFS决定是否有足够的可用块来判断其是否有足够的空闲空间。假设我们有128 MB的磁盘空间并创建了一个1MB的文件,那么#available blocks变为0(因为127 MB无法组成完整的HDFS块),即使有足够的磁盘空间,HDFS也将无法创建另一个1MB的文件。这听起来正确吗? - NPE
根据我的经验,HDFS会尝试创建块,并在具体节点上的空间不足时返回错误。 - David Gruzman

0
“可用块”将保持在79个(请参阅此问题)。无论如何,我认为HDFS并不决定它是否有足够的自由空间来满足“可用块”的要求。

0
HDFS块大小和Ext块大小不是同一回事。最简单的方法是将HDFS块大小称为“复制”块大小,而不是“存储”块大小。
对于存储,它将使用与本地文件系统相同的空间,因为这就是它使用的方式,但即使只使用1KB,它也会在节点之间复制不少于一个块。

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