mapreduce分片

  我们编写的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,当满足:

  1. 文件大小/splitSize>1.1时,创建一个split,文件剩余大小=文件大小-splitSize
  2. 文件剩余大小/splitSize<=1.1时,剩余的部分作为一个split

所以,map数是2,第一个分片的大小为50,第二个分片的大小为50。

  若mapred.map.tasks的值为1,则splitSize的大小为64,map数目同样是2,第一个分片的大小为64,第二个分片的大小为36。

  

原文地址:https://www.cnblogs.com/yueliming/p/3061040.html