2013-02-25 74 views
11

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

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

回答

18

要知道的最好方法就是尝试一下,看看我的结果在下面。

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

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

  • hadoop的版本1.0.4
  • 4个数据节点,每个节点具有比可用的空间,64 MB 4K
  • 块大小的EXT4块大小的5.0G少一点,1

默认复制HDFS开始后,我有以下的NameNode摘要:

  • 1文件和目录,0块S = 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剩余”)。

+0

这就是我猜测的。现在它更清晰。感谢您的详细解释和实验! – sachin2182 2013-02-25 17:45:16

1

HDFS只使用它在本地文件系统上的需求。因此,代表12 MB文件的块将在存储时(每个存储的数据节点上)占用12 MB。 因此,假设您有足够空间存储数据,那么您将可以拥有尽可能多的块。

+1

但我认为HDFS根据#available块来决定它是否有足够的可用空间。假设,如果我们拥有128 MB的磁盘空间并创建一个1MB文件,则#available块变为0(因为127 MB不能构成一个完整的HDFS块),HDFS将无法创建另一个1MB文件,即使存在足够的磁盘空间。这听起来正确吗? – sachin2182 2013-02-25 17:42:19

+0

从我的实验中,HDFS将尝试创建块并在具体节点上的空间不足时返回错误。 – 2013-02-25 20:51:34

+0

感谢您的澄清@大卫 – sachin2182 2013-02-25 21:37:39

0

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