一、概述
在执行MapReduce作业时,在map阶段读取数据前,FileInputFormat会根据一定的规则将将输入文件split成数据块进行分布式读取。split的个数决定了map的个数。影响文件切分的因素主要包括以下几个:
二、影响文件切分的几个因素
1、HDFS块的大小
Hdfs块的大小,也就是hadoop中dfs.block.size的大小。hadoop默认数据块的大小为128M;假如一个文件的大小是256M,则文件会被split为2个map。
2、文件大小
当分块大小为128M时,如果输入文件是128M则会被split一个块;当文件大小为1024M时,则会被split划分为4个块,也就是4个map;
3、文件个数
FileinputFormat按照文件进行split时,只会对大文件进行切分,如果一个文件没有达到默认切分块的大小,也会分配一个map进行处理;比如输入的文件目录中有300个10M的小文件,则会split出300个map作业。即超出默认数据块的大文件会被切分,小文件不进行切分,直接在一个map中进行处理。
4、splitsize的大小
FileinputFormat文件分片规则是按照splitsize的大小进行分割的,splitsize在没有设置的情况下默认是和hadoop存储数据块的大小是一致的,即128M;我们在开发MapReduce应用程序时可以对splitsize进行调节。
三、Map作业个数的计算公式
从hadoop源码中可以看到map的计算公式如下
1、分片大小计算公式
splitsize=max(minimumsize,min(maximumsize,blocksize))
如果没有设置minimumsize和maximumsize,splitsize的大小默认等于blocksize;
2、map个数计算公式
参考hadoop源码中的FileInputSplit类中的getSplits方法,可以看到文件分割map的计算方式如下
total_split ;
for(file :输入目录中的每个文件)
{
file_split = 1;
if(file.size》splitsize)
{
file_split=file_size/splitsize;
}
total_split+=file_split;
}