Hadoop HDFS中的大数据块大小!如何解释未使用的空间?

Hadoop HDFS中的大数据块大小!如何解释未使用的空间?,hadoop,mapreduce,hdfs,Hadoop,Mapreduce,Hdfs,我们都知道,与传统文件系统中的块大小相比,HDFS中的块大小相当大(64M或128M)。这样做是为了与传输时间相比减少寻道时间的百分比(传输速率的改进比磁盘寻道时间的改进大得多,因此,设计文件系统时的目标始终是与要传输的数据量相比减少寻道次数)。但这也带来了内部碎片的另一个缺点(这就是为什么传统的文件系统块大小不是很高,而且只有几KBs——通常是4K或8K) 我翻阅了《Hadoop》这本书,这本书是权威指南,我发现在某个地方写了这样一本书:小于HDFS的块大小的文件不会占用整个块,也不会占用整个

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


我翻阅了《Hadoop》这本书,这本书是权威指南,我发现在某个地方写了这样一本书:小于HDFS的块大小的文件不会占用整个块,也不会占用整个块的空间,但我不明白怎么做?有人能解释一下吗。

根据Hadoop-权威指南

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

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

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

-rw-rw-r--1培训11 10月21日15:27布莱克-763675431134396667_1002。元
-rw-rw-r--1培训4 10月21日15:27布莱克-763675431134396667
-rw-rw-r--1培训99 10月21日15:29布莱克-246451116551769838_1003。元
-rw-rw-r--1培训11403 10月21日15:29布莱克-246451116551769838
-rw-rw-r--1培训99 10月21日15:29布莱克-2951058074740783562_1004。元
-rw-rw-r--1培训11544 10月21日15:29卢克-2951058074740783562


HDFS中的块划分只是在逻辑上构建在底层文件系统(例如ext3/fat)的物理块上。文件系统在物理上没有划分为块(比如64MB或128MB或块大小)。它只是将元数据存储在NameNode中的抽象。由于NameNode必须在内存中加载整个元数据,因此对元数据条目的数量有限制,从而解释了需要较大的块大小

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


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

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

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

*不要把数字当回事,它们是捏造出来的数字,目的是为了说明问题

如果您有两个不同的1GB文件,那么每个文件将有2个1GB的块。在文件系统中,如果您存储两个文件,每个文件的大小为1KB,那么您将有两个不同的文件,大小为4KB+4KB=8KB,损耗为6KB


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

谢谢你的回答,但让我进一步澄清我的问题。假设有3个8MB的文件。在这种情况下会发生什么?它们会在HDFS上占用3个不同的块,还是同一个64M容量的块能够容纳这些单独的文件?如果HDFS中有3个8MB的文件,那么底层文件系统(ext3、ext4等)中将有3个8MB的文件。默认情况下,不同文件的块不会合并。如果需要,可用于将文件合并到同一块中。它类似于。那么,在这种情况下,它与传统的文件系统有何不同呢。在这种情况下,每个块中剩余的56 MB空间被浪费,即发生内部碎片。或者有没有一种方法可以证明在使用HDFS时这种情况很少发生?因为底层文件大小是8MB而不是64MB,所以没有56MB的浪费。我仍然没有完全理解它。在这种情况下,块是如何布置的,即,在这种情况下,内存的内部碎片是如何处理的?如果文件可以有不同的大小,那么块是如何布置的,也就是说,在写入文件之后,数据将如何写入。据我所知,数据是逐块写入的,那么如何利用前一块剩余的56MB配额呢。我希望你能理解我的问题(只是想澄清一下,为什么在传统的文件系统中块的大小只有几KBs),谢谢你的澄清。这正是我想要的。@Satbir:我需要澄清一下:三个8MB文件在逻辑上应该只占用一个块正确(因为HDFS块大小是64MB)?@头脑风暴:三个8MB文件可以占用3个块,每个块的大小都是8MB。所以HDFS块的大小与减少磁盘寻道时间无关……等等?@Satbir想澄清一下。我假设3个元数据条目是指3个副本,对吗?(原始+2副本,默认配置)。64MB的大小主要用于减少网络流量。没有o