一 如何控制Map任务数量
既然要讨论如何控制map任务数量,那么我们就得知道有哪些因素会影响map任务的数量。
我们知道,map任务的数量是由在提交job的时候,进行文件切片的时候,文件的切片数决定的。
在这个时候,无论你是否在配置文件设置mapreduce.job.maps参数,都将会重新设置这个值为文件的切片数。
而这个文件切片数又是由splitSize决定的。如果一个splitSize=20M,那么100M的文件就会生成5个切片。
那么splitSize又是由什么决定的呢?
intsplitSize = computeSplitSize():
具体逻辑就是:
maxSize:mapreduce.input.fileinputformat.split.maxsize,默认值是Integer.MAX_VALUE
minSize:mapreduce.input.fileinputformat.split.minsize,默认值是1
如果min(maxSize,blockSize)取其中最小的,假设结果为result
然后在max(minSize,result)取中较大者。
所以默认情况下,splitSize就是blockSize=128M
策略如下:
#如果希望调小maptask, 那么你需要调大minSize,至少保证minSize> blockSize(128M)
#如果希望调大maptask,那么你需要调小maxSize,至少保证maxSize< blockSize(128M)
#如果有很多小文件,你又想减少map任务,这时候我觉得你可以使用CombineInputFormat将多个文件组装成一个CombineInputSplit。
二 调整reduce数量
Reduce的数量是由mapreduce.job.reduces这个参数决定的,你也可以在job. setNumReduceTasks