了解hadoop中的自定义分区程序

时间:2013-08-21 11:20:28

标签: hadoop mapreduce mapper hadoop-partitioning reducers

我正在学习分区概念。任何人都可以解释下面的代码。我很难理解

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?

任何人都能解释一下吗?

1 个答案:

答案 0 :(得分:5)

一旦你把事情搞得一团糟,它并不像你想象的那么复杂。

taggedKey.getJoinKey().hashCode()将只返回一个整数。每个对象都有一个hashCode()函数,它只返回一个有希望对该对象本身唯一的数字。您可以查看TaggedKey的源代码,了解它是如何工作的,但是您需要知道的是它根据对象的内容返回一个整数。

%运算符执行模数除法,即执行除法后返回余数的位置。 (8%3 = 2,15%7 = 1等)。

所以假设你有3个分区器(numPartitions = 3)。每次使用3进行模数除法时,无论传递的是什么数字,都可以得到0,1或2。这用于确定3个分区中的哪个将获取数据。

分区程序的整个想法是,您可以使用它们对要排序的数据进行分组。如果你想按月排序,你可以将每个字符串“January”传递给第一个分区,“12月”传递给第12个分区,等等。但在你的情况下,它在外面看起来有点令人困惑。但实际上他们只是希望将数据均匀地扩散(希望),因此他们使用简单的散列/模数函数来随机选择分区。