如何使用MapReduce映射器将数据均匀分布到Reducer?

时间:2014-05-10 15:07:19

标签: hadoop mapreduce

我对MapReduce只有一个高层次的理解,但是关于实现中允许的内容的具体问题。

我想知道Mapper是否容易(或可能)在reducers之间均匀分配给定的键值对。它可能类似于

(k,v) -> (proc_id, (k,v))

其中proc_id是处理器的唯一标识符(假设每个键k都是唯一的)。

中心问题是,如果减速器的数量不固定(根据输入的大小动态确定;这甚至是在实践中如何完成?),那么映射器如何产生合理的id?一种方法是让映射器知道键值对的总数。 MapReduce是否允许地图制作者拥有此信息?另一种方法是执行少量额外的计算。

这样做的适当方法是什么?

1 个答案:

答案 0 :(得分:2)

减少器的密钥分配由分区程序完成。如果你没有另外指定,默认分区器使用一个简单的基于hashCode的分区算法,当每个键都是唯一的时,它会非常统一地分配密钥。

我假设您真正想要的是并行处理随机记录组,并且密钥k与记录的分组方式无关。这表明您应该专注于在地图方面进行工作。 Hadoop非常善于将输入干净地拆分为并行块以供映射器处理,所以除非你进行某种任意聚合,否则我认为根本没有理由减少。

通常,您提到的procId技术用于处理其他严重偏斜的组并取消它们(例如,在执行连接操作时)。在你的情况下,钥匙几乎没有任何意义。