我有一个处理少量数据(200 MB)的Mapreduce作业。map阶段在计算上很简单,但是reduce阶段可能在计算上很昂贵,需要花费更多的时间来分析一个输入。给定32 MB的分割大小,我看到在map阶段所有机器都在计算,但在reduce阶段只有一台机器在计算,并且reduce阶段的速度要慢得多。是否有一种方法可以使分割只在作业的减少阶段更小,这样我就可以在减少阶段使用所有的机器?
分割大小不影响reduce并行度。它只驱动映射器的数量。
MapReduce要求你指定要使用的reducer的数量。您可以设置mapreduce.job.reduces
属性(默认为1),或者使用Job.setNumReduceTasks(int tasks)
(参见javadoc)。这里,您想增加这个数字。
像Apache Crunch这样的高级工具会根据输入的大小、提供的比例因子和每个reducer的目标输入大小自动设置使用的reducer的数量。如果硬编码许多任务不符合您的需求,您可以轻松实现类似的策略。