我必须从n个候选列表中生成n*(n-1)/2个候选对。
这可以在每个mapper实例或每个reducer实例中完成。
但是我观察到,当这个操作在Reduce阶段完成时,它比在Map阶段完成要快得多。原因是什么?
映射器可以不支持繁重的计算吗?
Mapper实例做这样的计算对网络有什么影响?
谢谢!
简短的回答是:当使用mapper生成数据时,Hadoop必须从mapper复制数据到reducer,这花费了太多的时间。
result总数据大小
生成的总数据为O(n^2)
。
mapper与reducer生成数据的比较
如果使用mapper生成n*(n-1)/2
对,中间数据必须复制到reducer。这个步骤在Hadoop中被命名为Shuffle Phase。和reducer仍然需要将这些数据放到HDFS中。在shuffle阶段,您的cause中从硬盘读/写的数据总量可以达到6* sizeof(intermediate data)
,这是非常大的。
而如果数据是由reducer生成的,则不需要O(n^2)
中间数据转换。所以它可以有更好的性能。
改进映射器数据生成策略性能的方法
如果您仍然希望使用mapper来生成数据,可能是io.sort.factor
,打开压缩可能有助于提高性能。