我们都知道,与传统文件系统中的块大小相比,HDFS中的块大小相当大(64M或128M)。这样做是为了减少与传输时间相比的寻道时间百分比(因此,传输速率的改进比磁盘寻道时间的改进大得多,因此设计文件系统时的目标始终是减少与要转移的数据量相比的寻求次数)。但是这带来了内部碎片的另一个缺点(这就是为什么传统的文件系统块大小不是那么高并且只有几KB的量级 - 通常是4K或8K)。
我正在阅读这本书 - Hadoop,权威指南,发现这写在某个地方,一个小于HDFS块大小的文件没有占据整个块,并没有考虑整个块的空间但是无法理解怎么样?有人可以对此有所了解。
答案 0 :(得分:23)
HDFS中的块划分只是逻辑上构建在底层文件系统的物理块上(例如ext3 / fat)。文件系统没有物理上划分为块(例如64MB或128MB或者块大小)。它只是将元数据存储在NameNode中的抽象。由于NameNode必须在内存中加载整个元数据,因此元数据条目的数量有限,因此解释了对大块大小的需求。
因此,HDFS上存储的三个8MB文件在逻辑上占用了3个块(NameNode中有3个元数据条目),但在底层文件系统中实际占用8 * 3 = 24MB空间。
大块大小是为了考虑到NameNode内存限制时存储空间的正确使用。
答案 1 :(得分:11)
根据Hadoop - The Definitive Guide
与单个磁盘的文件系统不同,HDFS中小于单个块的文件不会占用整个块的底层存储空间。如果不合格,本书中的“块”一词指的是HDFS中的一个块。
HDFS中的每个块都作为文件存储在底层OS文件系统(ext3,ext4等)的数据节点中,相应的详细信息存储在名称节点中。假设文件大小为200MB,块大小为64MB。在这种情况下,文件将有4个块,对应于64MB,64MB,64MB和8MB大小的数据节点中的4个文件(假设复制为1)。
数据节点上的ls -ltr
将显示块详细信息
-rw-rw-r-- 1次训练训练11月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 10月21日15:29 blk_-2464541116551769838
-rw-rw-r-- 1次培训培训99 Oct 21 15:29 blk_-2951058074740783562_1004.meta
-rw-rw-r-- 1次培训11544 10月21日15:29 blk_-2951058074740783562
答案 2 :(得分:3)
在普通文件系统中,如果我们创建一个空白文件,那么它也保持4k大小,因为它存储在块上。在HDFS中它不会发生,对于1GB文件,仅使用1GB内存,而不是4GB。更清楚。
IN OS:文件大小1KB,块大小:4KB,使用的Mem:4KB,浪费:3KB。 IN HDFS:文件大小1GB,块大小:4GB,内存使用:1GB,浪费:0GB,剩余3 GB可供其他块免费使用。
*不要认真对待数字,他们是熟悉的数字,以明确说明。
如果您有2个不同的1GB文件,那么将有2个1 GB的块。在文件系统中,如果你每个存储2个1 KB的文件,那么你将有2个不同的文件,4KB + 4KB = 8KB,6KB的浪费。
这使HDFS比文件系统好得多。但具有讽刺意味的是HDFS使用的是本地文件系统,最终它会遇到同样的问题。