我必须从n个候选者列表中生成n *(n-1)/ 2个候选对。
这可以在每个映射器实例或每个reducer实例中完成。
但是我观察到,当这个操作在Reduce阶段完成时,它比在Map阶段完成的要快。是什么原因?
Mappers不支持繁重的计算吗?
Mapper实例在网络上进行此类计算的影响是什么?
谢谢!
答案 0 :(得分:0)
简短的回答是:当使用mapper生成数据时,Hadoop必须将数据从mapper复制到redcuer,这需要花费太多时间。
生成的总数据为O(n^2)
。
如果使用mapper生成n*(n-1)/2
对,则必须将中间数据复制到reducer。 Hadoop中的此步骤命名为 Shuffle Phase 。和reducer仍然需要将这些数据放到HDFS中。在随机播放阶段,您的原因中硬盘读取/写入的总数据可能是6* sizeof(intermediate data)
,这非常大。
如果数据是由reducer生成的,则O(n^2)
中间数据转换是不必要的。所以它可以有更好的表现。
因此,您的性能问题主要是由数据转换引起的,而不是计算引起的。如果没有磁盘访问,则mapper和reducer只具有相同的性能。
如果您仍想使用mapper生成数据,可能是io.sort.factor
,启用压缩可能有助于提高性能。