如果我们使用小文件,HDFS 是否会丢失内存?

Is there any memory loss in HDFS if we use small files?

我在下面引用了 Hadoop - 权威指南: 但是请注意,小文件占用的磁盘空间 space 不会超过存储文件原始内容所需的空间。例如,以 128 MB 的块大小存储的 1 MB 文件使用 1 MB 磁盘 space,而不是 128 MB,

这是我的问题

1) 以 128 MB 块大小存储的 1 MB 文件使用 1 MB 磁盘 space,而不是 128 MB。)hdfs 如何使用此块中剩余的 127M?

2)是否有机会在同一块中存储另一个文件?

NameNode 内存使用:

HDFS 中的每个文件、目录和块都表示为一个对象。即名称节点中的每个条目都反映到一个项目中。 在 namenode 的内存中,每个 object/item 占用 namenode 的 150 到 200 字节 memory.memorandums 由于需要存储元数据,因此更喜欢较少的大文件。

考虑一个默认块大小为 64MB 的 1 GB 文件。

-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 内存的开销,因为它需要更多 space 的 NameNode 内存。 Block Name and Block ID is a unique ID of a particular block of data.This uniue ID is getting used to identified 当客户端发出读取请求时读取数据期间的块 data.Hence 无法共享。

HDFS 是为处理大文件而设计的。假设您有一个 1000Mb 的文件。使用 4k 块大小,你必须赚取 256,000 获取该文件的请求(每个块 1 个请求)。在 HDFS 中,这些请求通过网络传输并带来大量开销。

名称节点必须处理每个请求,以确定可以在何处找到该块。那是很多流量! 如果您使用 64Mb 块,请求数量将减少到 16,大大降低名称节点上的开销和负载成本。

为了记住这些事情,hadoop 建议使用大块大小。

HDFS 块大小是将大文件拆分成小块的逻辑单位。这个块基本上称为块。 这些 chunks/block 在 data.i.e 的进一步并行处理期间使用。 MapReduce 编程或其他模型 到 HDFS 中的 read/process。

如果文件小到足以放入这个逻辑块,那么将为该文件分配一个块,它将 根据文件大小和您使用的 Unix 文件系统获取磁盘 space using.The 关于文件如何存储在磁盘中的详细信息,请参见此 link。

HDFS block size Vs actual file size

由于HDFS的块大小是逻辑单位而不是内存的物理单位,所以不会浪费内存。

这些 link 将有助于理解小文件的问题。

Link1, Link2

  1. 1 MB 文件存储在 128MB 块中,有 3 个复制。然后文件将存储在 3 个块中,并且仅使用 3*1=3 MB 而不是 3*128=384 MB。但它显示每个块大小为 128 MB。将元数据存储在名称节点中只是一种抽象,而不是实际使用的内存大小。

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

参考:

  1. 查看 Kumar 的回答
  2. 您可以根据您的用例查看 SequenceFiles 或 HAR 文件。 HAR 文件类似于 Tar 命令。 MapReduce 可以对每个 HAR 文件进行操作,但开销很小。至于序列文件,它们在某种程度上是 Key/Value 对的容器。这样做的好处是 Map 任务可以对这些对中的每一对进行操作。

HAR Files

Sequence Files

More About Sequence Files