我从Hadoop - The Definitive Guide中采取以下引用: 但请注意,小文件不会占用超过存储文件原始内容所需的磁盘空间。例如,以128 MB的块大小存储的1 MB文件使用1 MB的磁盘空间,而不是128 MB,
这是我的问题
1)以128 MB的块大小存储的1 MB文件使用1 MB的磁盘空间,而不是128 MB。)hdfs如何使用此块中的剩余127 MB?
2)是否有机会在同一个区块中存储另一个文件?
答案 0 :(得分:2)
NameNode内存使用情况:
HDFS中的每个文件,目录和块都表示为一个对象。即namenode的每个条目都反映到一个项目。 在namenode的内存中,每个object / item占用150到200个字节的namenode memory.memorandums因为需要存储的元数据而更喜欢较少的大文件。
考虑1 GB的文件,默认块大小为64 MB。
-Stored as a single file 1 GB file
Name: 1 item
Block=16
Total Item = 16*3( Replication factor=3) = 48 + 1(filename) = 49
Total NameNode memory: 150*49
-Stored as 1000 individual 1 MB files
Name: 1000
Block=1000
Total Item = 1000*3( Replication factor=3) = 3000 + 1000(filename) = 4000
Total NameNode memory: 150*4000
上面的结果澄清了大量的小文件是naemnode内存的开销,因为它需要更多的NameNode内存空间。 块名称和块ID是特定数据块的唯一ID。这个单一ID用于识别
当客户端请求读取数据时,在读取数据时阻塞。HDFS旨在处理大文件。假设您有一个1000Mb的文件。块大小为4k,你需要256,000 请求获取该文件(每个块1个请求)。在HDFS中,这些请求通过网络传递,并带来很多开销。
每个请求都必须由名称节点处理,以确定可以找到该块的位置。那是很多流量! 如果使用64Mb块,请求数将减少到16,从而大大降低了名称节点上的开销和负载成本。
为了记住这些事情,hadoop建议使用大块。
HDFS块大小是将大文件拆分为小块的逻辑单元。这个块基本上称为块。 在进一步并行处理数据期间使用这些块/块。 MapReduce编程或其他模型 在HDFS中读取/处理它。
如果文件足够小以适合此逻辑块,那么将为该文件分配一个块,它将会被分配 根据您正在使用的文件大小和Unix文件系统获取磁盘空间。此链接提供了有关文件如何存储在磁盘中的详细信息。
HDFS block size Vs actual file size
由于HDFS块大小是一个逻辑单元而不是内存的物理单元,因此不会浪费内存。
这些链接对于理解小文件的问题很有用。
答案 1 :(得分:2)
1 MB文件存储在128MB块中,复制3次。然后该文件将存储在3个块中并使用3 * 1 = 3 MB而不是3 * 128 = 384 MB。但它显示每个块大小为128 MB。它只是将元数据存储在namenode中的抽象,而不是实际使用的内存大小。
无法在单个块中存储多个文件。每个文件将存储在单独的块中。
参考:
答案 2 :(得分:0)