HDFS块大小与实际文件大小相同

时间:2013-02-25 08:00:06

标签: hdfs filesize

我知道HDFS使用数据节点中的常规linux文件系统存储数据。我的HDFS块大小为128 MB。假设我的hadoop集群中有10 GB个磁盘空间,这意味着HDFS最初具有80 blocks作为可用存储空间。

如果我创建一个说12.8 MB的小文件,那么#available HDFS块将变为79.如果我创建另一个12.8 MB的小文件会怎样? #availbale区块会保持在79还是会降到78?在前一种情况下,HDFS基本上根据可用的可用磁盘空间重新计算每个块分配后的#available块,因此,只有在消耗了超过128 MB的磁盘空间后,#available块才会变为78。请澄清。

4 个答案:

答案 0 :(得分:21)

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

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

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

  • hadoop version 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剩余”)。

答案 1 :(得分:1)

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

答案 2 :(得分:0)

'可用积木'将保持在79(see this question)。无论如何,我不认为HDFS会根据“可用块”来判断它是否有足够的可用空间。

答案 3 :(得分:0)

HDFS块大小和Ext块大小不是一回事。最简单的方法就是HDFS块大小是"复制"块大小,而不是"存储"块大小。

对于存储,它将使用与本地文件系统相同的空间量,因为它使用的是什么,但它将复制不少于节点之间的一个块,即使仅使用1KB < / p>