MapReduce框架的优势是可以在集群中并行运行mapper和reducer任务,那如何确定mapper和reducer的数量呢,或者说如何以编程的方式控制作业启动的mapper和reducer数量呢?在《Hadoop-2.4.1学习之Mapper和Reducer》中曾经提及建议reducer的数量为(0.95~1.75 ) * 节点数量 * 每个节点上最大的容器数,并可使用方法Job.setNumReduceTasks(int),mapper的数量由输入文件的大小确定,且没有相应的setNumMapTasks方法,但可以通过Configuration.set(JobContext.NUM_MAPS, int)设置,其中JobContext.NUM_MAPS的值为mapreduce.job.maps,而在Hadoop的官方网站上对该参数的描述为与MapReduce框架和作业配置巧妙地交互,并且设置起来更加复杂。从这样一句含糊不清的话无法得知究竟如何确定mapper的数量,显然只能求助于源代码了。
在Hadoop中MapReduce作业通过JobSubmitter类的submitJobInternal(Jobjob, Cluster cluster)方法向系统提交作业(该方法不仅设置mapper数量,还执行了一些其它操作如检查输出格式等,感兴趣的可以参考源代码),在该方法中与设置map

本文详细探讨了在Hadoop MapReduce中如何确定Mapper的数量。通过分析JobSubmitter的submitJobInternal方法和FileInputFormat的getSplits方法,了解到Mapper数量实际上由输入分片的数量决定,而分片数量由输入格式如TextInputFormat的getSplits方法生成。Mapper数量的计算涉及到配置参数如mapreduce.input.fileinputformat.split.minsize和dfs.blocksize等。在默认情况下,InputSplit大小等于dfs.blocksize,Mapper数量等于输入文件的Block数量。
订阅专栏 解锁全文
4506





