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

use*_*111 2 hadoop mapreduce reducers mapper hadoop-partitioning

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

public class TaggedJoiningPartitioner extends Partitioner<TaggedKey,Text> {

    @Override
    public int getPartition(TaggedKey taggedKey, Text text, int numPartitions) {
        return taggedKey.getJoinKey().hashCode() % numPartitions;
    }
}
Run Code Online (Sandbox Code Playgroud)

这个taggedKey.getJoinKey().hashCode()%numPartitions如何确定要为密钥执行哪个reducer?

任何人都能解释一下这个吗?

Eri*_*son 5

一旦你打破了一点点,它并不像你想象的那么复杂.

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

%运营商进行模数师,这是你执行除法后,退还剩余部分.(8%3 = 2,15%7 = 1等).

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

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

  • @ user1585111分区器在技术上不"获取"数据.它有一个函数getPartition,就像你上面发布的一样.调用此函数只是为了告诉映射器需要将数据传递给哪个reducer.如果这个答案对你来说是对的,你应该接受它是正确的:) (2认同)