如果自定义分区器为具有相同键的记录选择不同的分区怎么办?
Posted
技术标签:
【中文标题】如果自定义分区器为具有相同键的记录选择不同的分区怎么办?【英文标题】:What if a custom partitioner is made to select different partitions for records having the same key? 【发布时间】:2015-09-02 10:14:37 【问题描述】:在学习 Hadoop MapReduce 时,我遇到了如何创建自定义 Partitioner 类。我知道我们需要在我们的类中定义抽象的 getPartition 方法。该方法应该返回当前键值对的分区号(整数)。
现在,分区数将等于作业的 reduce 任务数。如果在自定义分区程序中,写一些逻辑来根据“值”而不是“键”选择分区怎么办?根据我的理解,这可能意味着具有相同键(但值不同)的记录可能会被不同的 reduce 任务处理,这不是 MapReduce 所保证的。这不是异常吗?为什么我们甚至需要 getPartition(key, value, numPartitions) 方法中的 'value' 参数?如果不正确,请纠正我的理解。
【问题讨论】:
【参考方案1】:可以基于中间(将数据溢出到磁盘之前映射器的输出)键或值进行分区。当您根据值进行分区时,两个不同的分区可以有具有相同键的记录。
【讨论】:
【参考方案2】:分区器对中间键值对进行操作,这只是将数据溢出到磁盘之前的映射输出。由于它对映射输出进行操作,因此它使用为映射键和值指定的相同可写对象,因此它同时使用键和值。 partitioner的主要思想是避免单个reducer获取几乎所有数据的倾斜,因此在计算partition index时不需要使用value。根据权威指南,甚至 该值被忽略。
【讨论】:
感谢您的回复。我遇到了以下链接,其中分区是根据值选择的。我很想知道在这种情况下会发生什么。两个不同的分区可以接收具有相同键的记录吗? http://hadooptutorial.wikispaces.com/Custom+partitioner以上是关于如果自定义分区器为具有相同键的记录选择不同的分区怎么办?的主要内容,如果未能解决你的问题,请参考以下文章
在 Kinesis 中使用分区键来保证具有相同键的记录由相同的记录处理器 (lambda) 处理