Hadoop的MapReduce计算的第一个阶段是InputFormat处理的,先将文件进行切分,然后将每个切分传递给每个Map任务来执行,本文阐述切分个数,也就是Map任务数目的计算方法;
Hadoop首先会计算每个切分的大小,然后使用”文件总大小/每个切分的大小“来决定划分的总数,如果不足一个切分的大小,则当做1个;
在org.apache.hadoop.mapred.FileInputFormat中给出了计算每个划分大小的方法:
protected long computeSplitSize(long goalSize, long minSize,
long blockSize) {
return Math.max(minSize, Math.min(goalSize, blockSize));
}
其中几个变量的解释如下:
- blockSize:HDFS存储的基本单元,默认为64MB或者128MB;
- minSize:由用户设置的最小切分大小,配置项为mapred.min.split.size;
- goalSize:计算公式为"文件总大小/用户设定的Map任务个数",即用户间接期望的大小;
由此可以推断出选定策略:
- 划分大小为blockSize:blockSize小于用户期望的大小,比用户设定的最小值要大;也就是说如果用户设定的最小值太小的话,会使用block size作为划分大小;
- 划分大小为goalSize:用户设定了Map的任务数目,那么即使算出来的划分大小比block size小也会使用,这个时候出现了两个用户设定值:最小值和期望值,hadoop会选择两者中大的那个;
- 划分大小为minSize:如果用户期望的值,还有blocksize只都比用户设定的最小值要小,那么就会使用这个最小值;
针对这几个值,用户可以根据输入数据的情况,合理的设置mapred.min.split.size和map.tasks.size来实现优化,InputSplit和blockSize相同是非常好的一种方法,因为不需要拆分block了.
文章地址:http://crazyant.net/1423.html