25

众所周知,HDFS 中的块大小与传统文件系统中的块大小相比非常大(64M 或 128M)。这样做是为了减少寻道时间与传输时间相比的百分比(传输速率的改进比磁盘寻道时间的改进要大得多,因此,设计文件系统的目标始终是减少与要传输的数据量相比的查找次数)。但这带来了内部碎片的另一个缺点(这就是为什么传统的文件系统块大小不那么大,并且只有几个 KB 的数量级 - 通常是 4K 或 8K)。

我正在阅读这本书 - Hadoop,权威指南,发现这写在某处,一个小于 HDFS 块大小的文件不占用整个块,也不占整个块的空间,但不明白怎么做?有人可以对此有所了解。

4

3 回答 3

29

HDFS 中的块划分只是在逻辑上建立在底层文件系统(例如 ext3/fat)的物理块之上。文件系统在物理上没有分成块(比如 64MB 或 128MB 或任何可能的块大小)。这只是将元数据存储在 NameNode 中的一种抽象。由于 NameNode 必须将整个元数据加载到内存中,因此元数据条目的数量是有限的,因此需要大块大小。

因此,存储在 HDFS 上的三个 8MB 文件在逻辑上占用 3 个块(NameNode 中的 3 个元数据条目),但在底层文件系统中物理占用 8*3=24MB 空间。

大块大小是为了在考虑到NameNode内存限制的同时,兼顾存储空间的合理使用。

于 2013-01-01T08:58:33.843 回答
11

根据 Hadoop - 权威指南

与单个磁盘的文件系统不同,HDFS 中小于单个块的文件不会占用整个块的底层存储空间。当不合格时,本书中的术语“块”指的是 HDFS 中的块。

HDFS 中的每个块都作为文件存储在底层 OS 文件系统(ext3、ext4 等)上的数据节点中,相应的详细信息存储在名称节点中。假设文件大小为 200MB,块大小为 64MB。在这种情况下,文件将有 4 个块,对应于 64MB、64MB、64MB 和 8MB 大小的数据节点中的 4 个文件(假设复制为 1)。

ls -ltr数据节点上的一个将显示块详细信息

-rw-rw-r-- 1 次培训培训 10 月 21 日 15:27 blk_-7636754311343966967_1002.meta
-rw-rw-r-- 1 次培训培训 10 月 21 日 15:27 blk_-7636754311343966967
-rw-rw-r-- 1 个培训培训 99 Oct 21 15:29 blk_-2464541116551769838_1003.meta
-rw-rw-r-- 1 个培训培训 11403 Oct 21 15:29 blk_-2464541116551769838
-rw-rw-r-- 1 个培训培训 99 Oct 21 15: 29 blk_-2951058074740783562_1004.meta
-rw-rw-r-- 1次培训培训11544 Oct 21 15:29 blk_-2951058074740783562

于 2012-10-22T15:16:36.693 回答
4

在普通文件系统中,如果我们创建一个空白文件,那么它也保持 4k 大小,因为它存储在块上。在 HDFS 中不会发生,对于 1GB 文件,仅使用 1GB 内存,而不是 4GB。要更清楚。

在操作系统中:文件大小 1KB,块大小:4KB,使用的内存:4KB,浪费:3 KB。在 HDFS 中:文件大小 1GB,块大小:4GB,使用的内存:1GB,浪费:0GB,剩余的 3 GB 可供其他块免费使用。

*不要认真对待数字,它们是为了说明问题而编造出来的数字。

如果您有 2 个不同的 1GB 文件,那么每个文件将有 2 个 1 GB 的块。在文件系统中,如果您存储 2 个每个 1 KB 的文件,那么您将拥有 2 个 4 KB + 4 KB = 8 KB 的不同文件,其中 6 KB 浪费。

所以这使得 HDFS 比文件系统好得多。但具有讽刺意味的是,HDFS 使用本地文件系统,最终会遇到同样的问题。

于 2015-11-05T12:47:47.430 回答