Hadoop map任务个数由输入文件在HDFS上的分块个数确定。
如果一个输入文件的大小大于BlockSize,那么这个输入文件被分成的若干个块,一个块即是一个split,map任务的个数等于块(split)的个数。
如果一个输入文件的大小小于BlockSize,则这个文件就是一个块(其占用的存储空间等于文件的实际大小),这个输入文件将被作为一个map任务的输入。
对于要处理大量小文件的MapReduce程序,由于一个小文件就需要启动一个Map task,太多的Map task会造成程序运行效率的低下,可以采用CombineFileInputFormat将多个input path合并成一个InputSplit送给mapper处理,从而减少Map任务的个数。
map个数的计算公式如下:
splitsize=max(minimumsize,min(maximumsize,blocksize))。
(如果没有设置minimumsize和maximumsize,splitsize的大小默认等于blocksize)
for(file :输入目录中的每个文件)
{
file_split = 1;
if(file.size>splitsize)
{
file_split=file_size/splitsize;
}
total_split+=file_split;
}