1.split大小
1.1 split大小计算
minSize=max{minSplitSize,mapred.min.split.size} (minSplitSize大小默认为1B)
maxSize=mapred.max.split.size(未配置文件中指定时为Long.MAX_VALUE)
splitSize=max{minSize,min{maxSize,blockSize}}
注意:blockSize为文件在hdfs中的块大小
1.2 配置方式
mapred-site.xml: mapred.min.split.size、mapred.max.split.size
hdfs-site.xml: blockSize
2.map个数调整
2.1 减少Mapper数量
输入文件size巨大:
这种情况可以通过增大每个mapper的input size,即增大minSize或blockSize来减少所需的mapper的数量。增大blockSize通常不可行,因为当HDFS被hadoop namenode -format之后,blockSize就已经确定了(由格式化时dfs.block.size决定),如果要更改blockSize,需要重新格式化HDFS。所以通常情况下只能通过增大minSize,即增大mapred.min.split.size的值。
输入大量小文件:
所谓小文件就是单个文件的size远小于blockSize。这种情况通过增大mapred.min.split.size不可行,需要使用FileInputFormat衍生的CombineFileInputFormat将多个input path合并成一个InputSplit送给mapper处理,从而减少mapper的数量。具体细节稍后会更新并展开。
2.2 增加Mapper数量
增加mapper的数量,可以通过减小每个mapper的输入做到,即减小blockSize或者减小mapred.min.split.size的值。 增大blockSize通常不可行,所以一般减小mapred.min.split.size的值。