一个inputsplit对应一个map
而inputsplit切片规划是由InputFormat的具体实现子类来实现,就是调用
InputSplits[ ] getSplits() 方法,这个方法的逻辑可以自定义
在默认情况下,由FileInputFormat来实现,它的核心逻辑:
规划切片的大小
long minSize = Math.max(getFormatMinSplitSize(), getMinSplitSize(job));
long maxSize = getMaxSplitSize(job);
public static long getMaxSplitSize(JobContext context) {
returncontext.getConfiguration().getLong(SPLIT_MAXSIZE, Long.MAX_VALUE);
}
// mapreduce.input.fileinputformat.split.minsize 配置这个值可以让切片大小>块大小
// mapreduce.input.fileinputformat.split.maxsize 配置这个值可以让切片大小<块大小
long splitSize = computeSplitSize(blockSize, minSize, maxSize);
//计算切片大小
protected long computeSplitSize(long blockSize, long minSize,long maxSize) {
return Math.max(minSize, Math.min(maxSize, blockSize));
}
(2)构造切片信息对象,并放入InputSplits[ ]中
splits.add(makeSplit(path,length-bytesRemaining,splitSize,blkLocations[blkIndex].getHosts()));
注:FileInputFormat的切片机制是针对一个一个的文件进行,因此,如果文件太小,则整个文件划分为一个切片
如果一个大文件被切成若干个切片后,剩下的长度如果在blocksize的1.1倍大小以内,则将剩下的长度全部规划为一个切片