我们都知道,与传统文件系统中的块大小相比,hdfs中的块大小非常大(64m或128m)。这样做是为了减少与传输时间相比的寻道时间百分比(传输速率的改进比磁盘寻道时间的改进大得多,因此,设计文件系统时的目标始终是减少与要传输的数据量相比的寻道次数)。但这也带来了内部碎片的另一个缺点(这就是为什么传统的文件系统块大小不是很高,而且只有几kbs的数量级—通常是4k或8k)。
我翻阅了《hadoop》这本书,这本书是权威性的指南,我发现这本书的某个地方写着这样一句话:小于hdfs的块大小的文件不会占用整个块,也不会占用整个块的空间,但是我不明白怎么做的?谁能帮我照一下这个吗。
3条答案
按热度按时间wgmfuz8q1#
hdfs中的块划分只是在逻辑上建立在底层文件系统(例如ext3/fat)的物理块之上。文件系统在物理上没有划分成块(比如64mb或128mb或任何块大小)。它只是在namenode中存储元数据的抽象。由于namenode必须在内存中加载整个元数据,因此元数据条目的数量是有限制的,这就解释了需要较大的块大小。
因此,存储在hdfs上的三个8mb文件在逻辑上占用了3个块(namenode中有3个元数据条目),但在物理上却占用了底层文件系统中8*3=24mb的空间。
大的块大小是为了在考虑namenode内存限制的同时,合理利用存储空间。
798qvoo82#
根据hadoop-权威指南
与单个磁盘的文件系统不同,hdfs中小于单个块的文件不会占用整个块的底层存储。当不合格时,本书中的术语“块”是指hdfs中的块。
hdfs中的每个块作为文件存储在底层os文件系统(ext3、ext4等)的data节点中,相应的细节存储在name节点中。假设文件大小为200mb,块大小为64mb。在这种情况下,文件将有4个块,对应于64mb、64mb、64mb和8mb大小的数据节点中的4个文件(假设复制为1)。
一
ls -ltr
在数据节点上将显示块的详细信息-rw-rw-r--1培训11 oct 21 15:27 blk\ U76367543113439669667\ U 1002.meta
-rw-rw-r--1培训4 10月21日15:27 blk泷-76367543113439669667
-rw-rw-r--1培训99 10月21日15:29 blk\ U2464541116551769838\ U 1003.meta
-rw-rw-r--1培训11403 10月21日15:29 blk泷-24645411651769838
-rw-rw-r--1培训99 10月21日15:29 blk\ U2951058074740783562\ U 1004.meta
-rw-rw-r--1培训11544 10月21日15:29 blk_
nkcskrwz3#
在普通文件系统中,如果我们创建一个空白文件,那么它也会保持4k大小,因为它存储在块上。在hdfs中,这种情况不会发生,对于1gb文件,只使用1gb内存,而不是4gb内存。更清楚地说。
在操作系统中:文件大小为1kb,块大小为4kb,使用的内存为4kb,损耗为3KB。在hdfs中:文件大小为1gb,块大小为4gb,使用的内存为1gb,损耗为0gb,剩余的3GB可供其他块使用。
如果您有两个不同的1gb文件,那么将有2个1 gb的块。在文件系统中,如果您存储两个文件,每个文件的大小为1KB,那么您将有两个不同的文件,大小为4kb+4kb=8kb,损耗为6kb。
所以这使得hdfs比文件系统好得多。但具有讽刺意味的是,hdfs使用本地文件系统,最终会出现同样的问题。