为什么要避免在hadoop hdfs中存储大量小文件?

ht4b089n  于 2021-06-02  发布在  Hadoop
关注(0)|答案(1)|浏览(548)

我读过很多存储在hdfs中的小文件可能是一个问题,因为很多小文件意味着很多对象hadoop namenode内存。
但是,由于每个块都作为对象存储在命名节点中,对于一个大文件,它有什么不同?无论您是将单个文件中的1000个块存储在内存中,还是将1000个块存储在1000个文件中,使用的namenode内存量是否相同?
类似的问题也适用于Map作业。既然它们是在块上操作的,那么块是小文件还是大文件又有什么关系呢?

oknwwptz

oknwwptz1#

在较高的层次上,您可以将hadoop namenode看作是组成hdfs中存储的“文件”的块所在位置的追踪器;当存储在hdfs集群中时,块用于将大文件分解成更小的片段。
当hdfs中存储了很多小文件时,也会有很多块,namenode必须跟踪内存中所有这些文件和块。
例如,当您有一个大文件时——如果您将所有这些文件合并到更大的文件中,首先——存储在hdfs中的文件会更少,块也会更少。
首先,让我们讨论一下文件大小、hdfs块和namenode内存之间的关系:
用例子和数字更容易看出这一点。
我们的hdfs namenode block size 在本例中为100 mb。
让我们假设我们有一千(1000)个1MB文件,并将它们存储在hdfs中。在hdfs中存储这1000个1mb文件时,我们的hdfs集群中也会有1000个块组成这些文件。
存储在hdfs中的每个块需要大约150字节的namenode内存,对于代表1000个1 mb文件的1000个块来说,这大约是150 kb的内存。
现在,考虑将这1000个1 mb文件合并或连接到一个1000 mb文件中,并将该文件存储在hdfs中。在hdfs中存储1000mb文件时,它将根据hdfs集群块大小被分解成块;在本例中,我们的块大小是100MB,这意味着我们的1000MB文件将作为十(10)个100MB块存储在hdfs集群中。
存储在hdfs中的每个块需要大约150字节的namenode内存,对于表示1 1000 mb文件的10个块来说,这大约是1.5 kb的内存。
对于较大的文件,我们在hdfs集群中存储了相同的数据,但是与许多小文件的情况相比,使用了1%的namenode内存。
输入块和作业的Map任务数是相关的。
当涉及到 Map 任务,通常每个输入块有一个Map任务。这里输入块的大小很重要,因为在开始和完成新任务时会有开销;i、 e.当map任务完成得太快时,此开销的数量将占每个任务完成时间的很大一部分,并且完成整个作业的速度可能比同一作业慢,但输入块更少、更大。对于基于mapreduce2的作业,map任务还涉及在资源管理层为每个任务启动和停止一个yarn容器,这会增加开销(请注意,您还可以指示mapreduce作业在处理许多小输入块时使用最小输入大小阈值,以解决其中的一些低效问题)

相关问题