在学习Hadoop MapReduce时,我遇到了如何创建自定义Partitioner类。我知道我们需要在类中定义抽象的getPartition方法。该方法应该返回当前键值对的分区号(整数)。
现在,分区数将等于作业的reduce任务数。如果在自定义分区程序中,编写一些逻辑来根据“值”而不是“键”选择分区,该怎么办?根据我的理解,这可能意味着具有相同密钥(但不同值)的记录可能由不同的reduce任务处理,这不是MapReduce所保证的。这不是一个异常吗?为什么我们甚至需要getPartition(key,value,numPartitions)方法中的'value'参数?如果不正确,请纠正我的理解。
答案 0 :(得分:2)
可以基于中间(将数据溢出到磁盘之前的映射器输出)键或值来进行分区。基于值进行分区时,两个不同的分区可以具有相同键的记录。
答案 1 :(得分:1)
分区程序操作中间键,值对,在将数据溢出到磁盘之前,它只是地图输出。由于它在map输出上运行,因此它使用为map键和值指定的相同可写,因此它使用键和值。分区器的主要思想是避免单个reducer的偏差几乎获得所有数据,因此在计算分区索引时不需要使用值。根据权威指南,即使该值也会被忽略。