如果我们使用小文件,hdfs中会有内存损失吗?

bprjcwpo  于 2021-06-02  发布在  Hadoop
关注(0)|答案(3)|浏览(315)

下面我引用了hadoop的一句话——权威指南:但是,请注意,小文件占用的磁盘空间不会超过存储文件原始内容所需的空间。例如,块大小为128 mb的1 mb文件使用1 mb磁盘空间,而不是128 mb,
这是我的问题
1) 以128 mb的块大小存储的1 mb文件使用1 mb的磁盘空间,而不是128 mb。)hdfs如何使用此块中剩余的127m?
2) 是否有可能在同一块中存储另一个文件?

wqsoz72f

wqsoz72f1#

见库马尔的回答
根据您的用例,您可以查看sequencefile或har文件。har文件类似于tar命令。mapreduce可以对每个har文件执行操作,但开销很小。至于SequenceFile,它们在某种程度上是键/值对的容器。这样做的好处是map任务可以作用于这些对中的每一个。
har文件
序列文件
有关序列文件的详细信息

2izufjch

2izufjch2#

namenode内存使用情况:
hdfs中的每个文件、目录和块都表示为一个对象。i、 e.namenode中的每个条目都反映到一个条目中。在namenode的内存中,每个对象/项占用150到200字节的namenode内存。由于需要存储元数据,内存更喜欢较少的大文件。
考虑使用默认块大小为64mb的1GB文件。

-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

以上结果表明,大量的小文件占用了namenode内存空间,是namenode内存的开销。块名称和块id是特定数据块的唯一id。当客户端请求读取数据时,此唯一id用于在读取数据期间标识块。因此无法共享。
hdfs被设计用来处理大文件。假设您有一个1000mb的文件。对于4k块大小,您必须发出256000个请求才能获取该文件(每个块1个请求)。在hdfs中,这些请求通过一个网络并带来大量开销。
每个请求都必须由name节点进行处理,以确定在何处可以找到该块。交通太拥挤了!如果使用64mb块,请求数将减少到16个,从而大大降低了name节点的开销和负载成本。
要记住这些,hadoop建议使用大块大小。
hdfs块大小是将大文件分割成小块的逻辑单位。这些块基本上叫做块。这些块/块在数据的进一步并行处理期间使用。mapreduce编程或其他模型来读取/处理hdfs中的数据。
如果一个文件足够小,可以放入这个逻辑块中,那么将为该文件分配一个块,它将根据文件大小和您使用的unix文件系统占用磁盘空间。有关文件如何存储在磁盘中的详细信息,请参阅此链接。
hdfs块大小与实际文件大小
由于hdfs的块大小是一个逻辑单元而不是内存的物理单元,所以没有内存的浪费。
这些链接将有助于理解小文件的问题。
链接1,链接2

gjmwrych

gjmwrych3#

1 mb文件存储在128mb块中,有3个复制。然后文件将存储在3个块中,并且仅使用31=3 mb而不是3128=384 mb。但它显示每个块的大小为128MB。它只是在namenode中存储元数据的抽象,而不是实际使用的内存大小。
无法在单个块中存储多个文件。每个文件将存储在一个单独的块中。
参考文献:
https://stackoverflow.com/a/21274388/3496666
https://stackoverflow.com/a/15065274/3496666
https://stackoverflow.com/a/14109147/3496666

相关问题