Fork me on GitHub

Hadoop Map个数计算

计算分片大小的公式是

1
2
3
4
5
6
7
# 下限: 参数mapred.min.split.size的默认值为1个字节,minSplitSize随着File Format的不同而不同。
minSize = max {mapred.min.split.size, minSplitSize}
# 上限: totalSize是一个JOB的所有map总的输入大小。参数mapred.map.tasks的期望大小默认值是2,设置值只有在大于默认值的时候,才会生效。
maxSize = min(totalSize / mapred.map.tasks, dfs.block.size)
splitSize = max (minSize, maxSize)

举几个例子,例如
  Map input bytes是100兆,
  mapred.map.tasks默认值为2,那么分片大小就是50兆;
  如果我们把mapred.map.tasks改成1,那分片大小就变成了64兆。

计算map数

  计算好了分片大小之后接下来计算map数。Map数的计算是以文件为单位的,针对每一个文件做一个循环:
  1.文件大小/splitsize>1.1,创建一个split,这个split的大小=splitsize,文件剩余大小=文件大小-splitsize
  2.文件剩余大小/splitsize< 1.1,剩余的部分作为一个split

举几个例子:
  1.input只有一个文件,大小为100M,splitsize=blocksize,则map数为2,第一个map处理的分片为64M,第二个为36M
  2.input只有一个文件,大小为65M,splitsize=blocksize,则map数为1,处理的分片大小为65M (因为65/64< 1.1)
  3.input有两个文件,大小为100M和20M,splitsize=blocksize,则map数为3,第一个文件分为两个map,第一个map处理的分片为64M,第二个为36M,第二个文件分为一个map,处理的分片大小为20M
  4.input有10个文件,每个大小10M,splitsize=blocksize,则map数为10,每个map处理的分片大小为10M

有2个特例:
  根据分片与map数的计算方法可以得出结论,一个map处理的分片最大不超过dfs.block.size * 1.1 ,默认情况下是70.4兆。但是
  1.Hive中合并小文件的map only JOB,此JOB只会有一个或很少的几个map。
  2.输入文件格式为压缩的Text File,因为压缩的文本格式不知道如何拆分,所以也只能用一个map。

-----------------本文结束,感谢您的阅读-----------------