设定InputSplitSize确定Map Task数
都知道运行job时可以通过Job.setNumReduceTasks(int tasks)来设定Reduce任务数,那么Map任务数如何设定呢,API中并没有提供像直接指定Reduce任务数那样来直接指定Map任务数的方法,先来理下逻辑:
首先,文件在上传到Hdfs文件系统的时候,被切分成不同的Block块(默认大小为128MB,这里是hadoop2,hadoop1是64M)。但是每个Map处理的分块有时候并不是系统的物理Block块大小。实际处理的输入分块的大小是根据InputSplit来设定的,那么InputSplit是怎么得到的呢?
看源码可知计算splitSize过程以下是部分代码,可从org.apache.hadoop.mapreduce.lib.input.FileInputFormat查看,该版本为2.6:
public static final String SPLIT_MAXSIZE = "mapreduce.input.fileinputformat.split.maxsize";
public static final String SPLIT_MINSIZE = "mapreduce.input.fileinputformat.split.minsize";
//...
long minSize = Math.max(getFormatMinSplitSize(), getMinSplitSize(job));
long maxSize = getMaxSplitSize(job);
long splitSize = computeSplitSize(blockSize, minSize, maxSize);
protected long getFormatMinSplitSize() {
return 1;
}
public static long getMinSplitSize(JobContext job) {
return job.getConfiguration().getLong(SPLIT_MINSIZE, 1L);
}
public static long getMaxSplitSize(JobContext context) {
return context.getConfiguration().getLong(SPLIT_MAXSIZE,Long.MAX_VALUE);
}
protected long computeSplitSize(long blockSize, long minSize,long maxSize) {
return Math.max(minSize, Math.min(maxSize, blockSize));
}
因此可以通过如下设定来确定map task数:
FileInputFormat.setMaxInputSplitSize(Job, 1024*1024*size);
FileInputFormat.setMinInputSplitSize(Job, 1l);
上一篇: HTML5离线应用与客户端存储的实现