每个人都知道Hadoop对小文件的处理能力很差,导致它必须使用的映射器数量。 但是那些比块大小稍大的大文件呢。
作为一个例子,让我们说hdfs块大小是128mb,hadoop接收126mb到130mb之间的文件。
126mb到128mb之间的文件适合存放在hadoop中但是129mb-130mb的文件怎么样,hadoop需要2个映射器才能读取这些文件?如何在hadoop中处理这个问题betside使hdfs块更大的事实?
提前感谢:)
答案 0 :(得分:1)
一旦越过128Mb边界,就需要第二块。
例如,文件130mb将显示为2个块:前128个,第二个是文件的其余部分
HDFS用于处理大文件。假设您有一个1000Mb的文件。对于4k块大小,您必须发出256,000个请求来获取该文件(每个块1个请求)。在HDFS中,这些请求通过网络传递,并带来很多开销。每个请求都必须由名称节点处理,以确定可以找到该块的位置。那是很多流量!如果使用64Mb块,请求数将减少到16,从而大大降低了名称节点上的开销和负载成本。
答案 1 :(得分:1)
映射器的数量取决于框架计算的输入拆分的数量,而不是构成文件的块的数量。输入拆分可以超过块。在这种情况下,超过块大小的数据仍将由单个映射任务处理。输入拆分是计算的逻辑单位(通过映射器),而块是存储的逻辑单元(通过HDFS)。
也就是说,如果文件有第二个输入分割,则需要第二个映射器。
答案 2 :(得分:0)
我认为你对HDFS和mapreduce之间的关系有误解。 HDFS是底层文件系统,mapreduce是计算框架。它自己的HDFS根本不使用mapreduce框架来进行操作。 Mapreduce作业在查找工作罐时使用HDFS作为文件系统,编写临时处理数据,拉取文件进行处理或任何其他文件操作。映射器/缩减器的数量在作业提交时设置,并由提交作业的mapreduce客户端决定。
如果你有一个500MB的文件被分成4个128MB的块,你想要运行一个字数统计mapreduce作业,它读取一个文件并输出每个出现的单词的计数,你用4个映射器和2运行它减速器,您将最终处理每个地图任务处理4 x 128MB块之一。作业将与HDFS名称节点通信以请求文件,namenode将响应构建文件所需的所有块,并给出块的位置。映射阶段将从其数据节点读取这些文件并在处理它们之后生成4个文件(例如,部分0000,部分0001,部分0002,部分0003),还原阶段将对每个文件中的单词进行排序和计算。给出它的最终结果。
您不需要因为文件大于块大小而使块更大。这违背了分布式文件系统或任何现有文件系统的目的。 HDFS(以及我使用过的所有文件系统)都可以拥有8GB文件 - 它仍会将其分解为128MB块或者您设置为块大小的任何内容。