当我将许多小文件存储到HDFS中时,它们会存储在一个块中吗?
在我看来,根据这个讨论,这些小文件应该存储在一个块中: HDFS block size Vs actual file size
答案 0 :(得分:11)
引自 Hadoop - 权威指南:
HDFS低效存储小文件,因为每个文件存储在一个块中,并阻止 元数据由namenode保存在内存中。因此,大量的小文件都可以 在namenode上占用了大量内存。 (但请注意,小文件不需要 比存储文件的原始内容所需的磁盘空间更多。对于 例如,以128 MB的块大小存储的1 MB文件使用1 MB的磁盘空间,而不是 128 MB。) Hadoop Archives 或HAR文件是将文件打包到HDFS的文件存档工具 更高效地阻止,从而减少名字节点内存使用,同时仍然允许 透明访问文件。
结论:每个文件都会存储在一个单独的块中。
答案 1 :(得分:2)
以下是Hadoop权威指南中指定的内容:
与单个磁盘的文件系统不同,HDFS中的文件较小 而不是一个块不占据整个块的价值 底层存储
例如,如果您有30 MB文件且块大小为64 MB,则此文件将逻辑存储在一个块中,但在物理文件系统中,HDFS仅使用30 MB来存储该文件。剩下的30 MB可以免费使用。
答案 2 :(得分:0)
每个块只属于一个文件,如下所示: 1.使用fsck命令获取文件的块信息:
hadoop fsck /gavial/data/OB/AIR/PM25/201709/01/15_00.json -files -blocks
这样说:
/gavial/data/OB/AIR/PM25/201709/01/15_00.json 521340 bytes, 1 block(s): OK
0. BP-1004679263-192.168.130.151-1485326068364:blk_1074920015_1179253 len=521340 repl=3
Status: HEALTHY
Total size: 521340 B
Total dirs: 0
Total files: 1
Total symlinks: 0
Total blocks (validated): 1 (avg. block size 521340 B)
Minimally replicated blocks: 1 (100.0 %)
Over-replicated blocks: 0 (0.0 %)
块ID是
blk_1074920015
2.使用fsck命令显示阻止状态,像这样输出
hdfs fsck -blockId blk_1074920015
Block Id: blk_1074920015
Block belongs to: /gavial/data/OB/AIR/PM25/201709/01/15_00.json
No. of Expected Replica: 3
No. of live Replica: 3
No. of excess Replica: 0
No. of stale Replica: 0
No. of decommission Replica: 0
No. of corrupted Replica: 0
Block replica on datanode/rack: datanode-5/default-rack is HEALTHY
Block replica on datanode/rack: datanode-1/default-rack is HEALTHY
显然,该块只属于一个文件
答案 3 :(得分:-1)
是。当您存储大量小文件时,它们将存储在一个块中,直到该块具有相等的容纳空间。 但效率低下是因为对于每个小文件,都会在namenode中为每个小文件创建一个索引条目(文件名,块,偏移量)。如果我们有许多小文件而不是少量非常大的文件,这会浪费为namenode中的元数据保留的内存。