我们编写的mapreduce程序,也即Job,当它被提交到云计算平台以后,根据输入文件的大小,mapreduce框架会创建若干个map任务,map任务的数量有分片(split)的个数决定,那么待处理的数据会被划分成几个split呢,很明显,这是有split的大小决定的,下面让我们来看一下split大小的计算方法(摘自高清元的微博:http://weibo.com/576203331)。
splitSize=max(minSize,min(goalSize,dfs.block.size))
minSize=max(mapred.min.split.size,minSplitSize)(mapred.min.split.size默认为一个字节,minSplitSize随着FileInputFormat的不同而不同,TextInputFormat中默认大小为一个字节)
goalSize=totalSize/mapred.map.tasks(totalSize为输入文件的大小,mapred.map.tasks的默认值为2)
默认情况下,splitSize的大小也就是min(goalSize,dfs.block.size)。
当我们的输入文件大小为100M时,若mapred.map.tasks的值为2,则goalSize的大小为50,倘若dfs.block.size的值为64,那么分片的大小splitSize为50,当满足:
- 文件大小/splitSize>1.1时,创建一个split,文件剩余大小=文件大小-splitSize
- 文件剩余大小/splitSize<=1.1时,剩余的部分作为一个split
所以,map数是2,第一个分片的大小为50,第二个分片的大小为50。
若mapred.map.tasks的值为1,则splitSize的大小为64,map数目同样是2,第一个分片的大小为64,第二个分片的大小为36。