在学习hadoopmapreduce时,我遇到了如何创建自定义分区器类。我知道我们需要在类中定义抽象getpartition方法。此方法应该返回当前键值对的分区号(整数)。
现在,分区的数量将等于作业的reduce任务的数量。如果在自定义分区器中,根据“值”而不是“键”编写一些逻辑来选择分区,会怎么样?据我所知,这可能意味着具有相同键(但值不同)的记录可能由不同的reduce任务处理,这不是mapreduce所保证的。这不是反常现象吗?为什么我们甚至需要getpartition(key,value,numpartitions)方法中的'value'参数呢?如果不正确,请纠正我的理解。
2条答案
按热度按时间1wnzp6jl1#
分区器对中间键、值对进行操作,中间键、值对只不过是将数据溢出到磁盘之前的Map输出。因为它对Map输出进行操作,所以它使用为Map键和值指定的相同可写性,因此它同时使用键和值。partitioner的主要思想是避免单个reducer得到几乎所有数据的倾斜,因此在计算分区索引时不需要使用值。而根据权威指南,甚至这个值都被忽略了。
zy1mlcev2#
分区可以基于中间键或值(将数据溢出到磁盘之前Map器的输出)进行。当您基于值进行分区时,两个不同的分区可以有具有相同键的记录。