从该代码并结合第一部分的分析可以得知,InputSplit的大小取决于dfs.blocksiz、mapreduce.input.fileinputformat.split.minsize、mapreduce.input.fileinputformat.split.maxsize和所使用的输入格式。在输入格式为TextInputFormat的情况下,且不修改InputSplit的最大值和最小值的情况,InputSplit的最终值为dfs.blocksize的值。
变量SPLIT_SLOP的值为1.1,决定了当剩余文件大小多大时停止按照变量splitSize分割文件。根据代码可知,当剩余文件小于等于1.1倍splitSize时,将把剩余的文件做为一个InputSplit,即最后一个InputSplit的大小最大为1.1倍splitSize。
总结
本文分析了在输入格式为默认的TextInputFormat的情况,如何确定mapper的数量。在不修改源代码的情况下(修改输入格式的InputSplit下限),程序员可以通过设置dfs.blocksiz、mapreduce.input.fileinputformat.split.minsize、mapreduce.input.fileinputformat.split.maxsize参数的值设置InputSplit的大小来影响InputSplit的数量,进而决定mapper的数量。当输入为其它格式时,处理逻辑又不相同了,比如当输入格式为DBInputFormat时,会根据输入表的行数(记录数)决定mapper的数量,更多细节可以参考源代码。
CentOS安装和配置Hadoop2.2.0
Ubuntu 13.04上搭建Hadoop环境