如果我们使用小文件,HDFS中是否有任何内存丢失?

时间:2015-05-11 10:27:08

标签: hadoop hdfs

我从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)是否有机会在同一个区块中存储另一个文件?

3 个答案:

答案 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块大小是一个逻辑单元而不是内存的物理单元,因此不会浪费内存。

这些链接对于理解小文件的问题很有用。

Link1Link2

答案 1 :(得分:2)

  1. 1 MB文件存储在128MB块中,复制3次。然后该文件将存储在3个块中并使用3 * 1 = 3 MB而不是3 * 128 = 384 MB。但它显示每个块大小为128 MB。它只是将元数据存储在namenode中的抽象,而不是实际使用的内存大小。

  2. 无法在单个块中存储多个文件。每个文件将存储在单独的块中。

  3. 参考:

    1. https://stackoverflow.com/a/21274388/3496666
    2. https://stackoverflow.com/a/15065274/3496666
    3. https://stackoverflow.com/a/14109147/3496666

答案 2 :(得分:0)

  1. 见Kumar的答案
  2. 您可以根据您的使用情况查看SequenceFiles或HAR Files。 HAR文件类似于Tar命令。 MapReduce可以在一点点开销的情况下对每个HAR文件起作用。对于SequenceFiles,它们在某种程度上是键/值对的容器。这样做的好处是Map任务可以对这些对中的每一对进行操作。
  3. HAR Files

    Sequence Files

    More About Sequence Files