16

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

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

4

4 回答 4

23

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

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

于 2013-02-25T10:51:53.060 回答
1

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

于 2013-02-25T11:41:16.383 回答
0

“可用块”将保持在 79(请参阅此问题)。无论如何,我认为 HDFS 不会根据“可用块”来决定它是否有足够的可用空间。

于 2013-03-29T03:11:58.090 回答
0

HDFS 块大小和 Ext 块大小不是一回事。最简单的说法是 HDFS 块大小是“复制”块大小,而不是“存储”块大小。

对于存储,它将使用与本地文件系统相同的空间量,因为这就是它使用的空间,但它会在节点之间复制不少于一个块,即使只使用了 1KB

于 2018-03-22T17:18:21.587 回答