如果使用自定义分区器为具有相同键的记录选择不同的分区怎么办?



在学习Hadoop MapReduce时,我遇到了如何创建自定义Partitioner类。我理解我们需要在类中定义抽象的getPartition方法。这个方法应该返回当前键值对的分区号(一个整数)。

现在,分区的数量将等于作业的reduce任务的数量。如果在自定义分区程序中,编写一些逻辑来根据"值"而不是"键"选择分区,会怎么样?根据我的理解,这可能意味着具有相同键(但不同值)的记录可能由不同的reduce任务处理,这不是MapReduce所保证的。这不是反常吗?为什么我们甚至需要getPartition(key, value, numPartitions)方法中的"value"参数?如果我的理解有误,请纠正。

可以根据中间键或值(映射器在将数据溢出到磁盘之前的输出)进行分区。当基于值进行分区时,两个不同的分区可以有具有相同键的记录。

分区器在将数据溢出到磁盘之前对中间键值对进行操作,这只不过是映射输出。由于它操作map输出,因此它使用与为map键和值指定的相同的可写对象,因此它同时使用键和值。partitioner的主要思想是为了避免单个reducer获取几乎所有数据的倾斜,因此在计算分区索引时不需要使用value。根据权威指南甚至,该值被忽略

相关内容

  • 没有找到相关文章