我正在学习分区概念。任何人都可以解释下面的代码。我很难理解
public class TaggedJoiningPartitioner extends Partitioner<TaggedKey,Text> {
@Override
public int getPartition(TaggedKey taggedKey, Text text, int numPartitions) {
return taggedKey.getJoinKey().hashCode() % numPartitions;
}
}
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?
任何人都能解释一下吗?
答案 0 :(得分:5)
一旦你把事情搞得一团糟,它并不像你想象的那么复杂。
taggedKey.getJoinKey().hashCode()
将只返回一个整数。每个对象都有一个hashCode()
函数,它只返回一个有希望对该对象本身唯一的数字。您可以查看TaggedKey
的源代码,了解它是如何工作的,但是您需要知道的是它根据对象的内容返回一个整数。
%
运算符执行模数除法,即执行除法后返回余数的位置。 (8%3 = 2,15%7 = 1等)。
所以假设你有3个分区器(numPartitions = 3)。每次使用3进行模数除法时,无论传递的是什么数字,都可以得到0,1或2。这用于确定3个分区中的哪个将获取数据。
分区程序的整个想法是,您可以使用它们对要排序的数据进行分组。如果你想按月排序,你可以将每个字符串“January”传递给第一个分区,“12月”传递给第12个分区,等等。但在你的情况下,它在外面看起来有点令人困惑。但实际上他们只是希望将数据均匀地扩散(希望),因此他们使用简单的散列/模数函数来随机选择分区。