我对MapReduce只有一个高层次的理解,但是关于实现中允许的内容的具体问题。
我想知道Mapper是否容易(或可能)在reducers之间均匀分配给定的键值对。它可能类似于
(k,v) -> (proc_id, (k,v))
其中proc_id
是处理器的唯一标识符(假设每个键k
都是唯一的)。
中心问题是,如果减速器的数量不固定(根据输入的大小动态确定;这甚至是在实践中如何完成?),那么映射器如何产生合理的id?一种方法是让映射器知道键值对的总数。 MapReduce是否允许地图制作者拥有此信息?另一种方法是执行少量额外的计算。
这样做的适当方法是什么?
答案 0 :(得分:2)
减少器的密钥分配由分区程序完成。如果你没有另外指定,默认分区器使用一个简单的基于hashCode的分区算法,当每个键都是唯一的时,它会非常统一地分配密钥。
我假设您真正想要的是并行处理随机记录组,并且密钥k与记录的分组方式无关。这表明您应该专注于在地图方面进行工作。 Hadoop非常善于将输入干净地拆分为并行块以供映射器处理,所以除非你进行某种任意聚合,否则我认为根本没有理由减少。
通常,您提到的procId技术用于处理其他严重偏斜的组并取消它们(例如,在执行连接操作时)。在你的情况下,钥匙几乎没有任何意义。