我有一个使用少量数据(200 MB)的Mapreduce作业。地图阶段在计算上很简单,但是减少阶段在计算上可能是昂贵的,花费更多时间来分析一个输入。给定32 MB的分割大小,我看到在映射阶段所有计算机都在计算,但在reduce阶段只有一个,并且reduce阶段经历的速度要慢得多。有没有办法只在作业的减少阶段使分割更小,以便我可以将所有机器用于减少阶段?
答案 0 :(得分:1)
拆分大小不会影响降低并行度。它只会驱动映射器的数量。
MapReduce要求您指定要使用的减速器数量。您可以设置mapreduce.job.reduces
属性,默认为1,或使用Job.setNumReduceTasks(int tasks)
(see javadoc)。在这里,你想增加这个数字。
像Apache Crunch这样的高级工具会自动根据输入的大小设置减速器的数量,为每个减速器提供缩放系数和目标输入大小。如果硬编码一些任务不符合您的需求,您可以轻松实现类似的策略。