Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/hadoop/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么我应该避免在Hadoop HDFS中存储大量小文件?_Hadoop_Hdfs - Fatal编程技术网

为什么我应该避免在Hadoop HDFS中存储大量小文件?

为什么我应该避免在Hadoop HDFS中存储大量小文件?,hadoop,hdfs,Hadoop,Hdfs,我已经读到,HDFS中存储的大量小文件可能是一个问题,因为大量小文件意味着Hadoop NameNode内存中有大量对象 但是,由于每个块都作为对象存储在命名节点中,对于一个大文件,它有什么不同?无论是在内存中存储单个文件中的1000个块,还是为1000个文件存储1000个块,使用的NameNode内存量是否相同 地图作业也有类似的问题。由于它们是在块上运行的,那么块是小文件还是大文件又有什么关系呢?在高层,您可以将Hadoop NameNode视为组成HDFS中存储的“文件”的块所在位置的跟踪

我已经读到,HDFS中存储的大量小文件可能是一个问题,因为大量小文件意味着Hadoop NameNode内存中有大量对象

但是,由于每个块都作为对象存储在命名节点中,对于一个大文件,它有什么不同?无论是在内存中存储单个文件中的1000个块,还是为1000个文件存储1000个块,使用的NameNode内存量是否相同


地图作业也有类似的问题。由于它们是在块上运行的,那么块是小文件还是大文件又有什么关系呢?

在高层,您可以将Hadoop NameNode视为组成HDFS中存储的“文件”的块所在位置的跟踪器;当存储在HDFS集群中时,块用于将大文件分解为较小的部分

  • 当您在HDFS中存储了很多小文件时,也会有很多块,NameNode必须跟踪内存中的所有这些文件和块
例如,当您有一个大文件时——如果您将所有这些文件合并成更大的文件,首先——您将有更少的文件存储在HDFS中,并且您也将有更少的块

首先,让我们讨论文件大小、HDFS块和NameNode内存之间的关系:

通过示例和数字更容易看出这一点

在本例中,我们的HDFS NameNode的
块大小为100MB

让我们假设我们有一千(1000)个1MB文件,并将它们存储在HDFS中。当在HDFS中存储这1000个1MB文件时,我们的HDFS集群中也会有1000个块组成这些文件

  • 存储在HDFS中的每个块需要大约150字节的NameNode内存,对于代表1000 MB文件的1000个块来说,这大约是150 KB的内存

现在,考虑我们将这1000个1 MB文件合并或连接成一个单独的1000 MB文件,并将该文件存储在HDFS中。在HDFS中存储1000 MB文件时,将根据HDFS集群块大小将其分解为块;在本例中,我们的块大小为100MB,这意味着我们的1000MB文件将作为十(10)个100MB块存储在HDFS集群中

  • 存储在HDFS中的每个块需要大约150字节的NameNode内存,对于表示1 1000 MB文件的10个块来说,这大约是1.5 KB的内存
对于较大的文件,我们在HDFS集群中存储了相同的数据,但与许多小文件相比,使用了1%的NameNode内存

输入块和作业的映射任务数是相关的

当涉及到
Map
任务时,通常每个输入块有一个Map任务。这里输入块的大小很重要,因为启动和完成新任务会产生开销;i、 e.当Map任务完成得太快时,此开销的数量将占每个任务完成时间的较大部分,并且总体作业的完成速度可能比同一作业慢,但输入块更少、更大。对于基于MapReduce2的作业,映射任务还涉及在资源管理层为每个任务启动和停止一个纱线容器,这会增加开销。(请注意,您还可以指示MapReduce作业在处理许多小输入块时使用最小输入大小阈值,以解决其中一些低效问题)