我正在学习分区器的概念。有人能给我解释一下下面的代码吗?我很难理解public class TaggedJoiningPartitioner extends Partitioner<TaggedKey,Text> { @Override public int getPartition(TaggedKey taggedKey, Text text, int numPartitions) { return taggedKey.getJoinKey().hashCode() % numPartitions; } }
这个taggedkey.getjoinkey().hashcode()%numpartitions如何决定要为一个键执行哪个reducer?
有人能给我解释一下吗?
1条答案
按热度按时间9q78igpj1#
一旦你把事情分解一点,事情就没有你想象的那么复杂了。
taggedKey.getJoinKey().hashCode()
只返回一个整数。每个物体都有一个hashCode()
函数,只返回一个对该对象本身唯一的数字。你可以查一下TaggedKey
如果您愿意,可以查看它的工作方式,但您需要知道的是,它返回一个基于对象内容的整数。这个
%
运算符执行模数除法,这是执行除法后返回余数的地方(8%3=2,15%7=1等)。假设有3个分区器(numpartitions=3)。每次你用3除模,你会得到0,1,或2,不管传递的是什么数字。这用于确定3个分区中的哪一个将获得数据。
分区器的整体思想是,您可以使用它们对要排序的数据进行分组。如果您想按月份排序,可以将字符串为“一月”的每一个数据段传递给第一个分区,将“十二月”传递给第12个分区,等等。但是在您的例子中,外部看起来有点混乱。但实际上,他们只是希望将数据均匀地分布(希望如此),所以他们使用一个简单的哈希/模函数随机选择分区。