【问题标题】:understanding custom partitioner in hadoop了解hadoop中的自定义分区器
【发布时间】:2013-08-23 17:49:57
【问题描述】:

我现在正在学习分区器的概念。谁能解释一下下面的代码。我很难理解

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?

谁能给我解释一下?

【问题讨论】:

    标签: hadoop mapreduce mapper hadoop-partitioning reducers


    【解决方案1】:

    只要稍微分解一下,它就没有你想象的那么复杂。

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

    % 运算符执行模除法,这是您在执行除法后返回余数的地方。 (8 % 3 = 2、15 % 7 = 1 等)。

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

    分区器的整个想法是您可以使用它们对要排序的数据进行分组。如果您想按月份排序,您可以将带有字符串“January”的每条数据传递给第一个分区,将“December”传递给第 12 个分区等。但在你的情况下,它在外面看起来有点混乱。但实际上他们只是想(希望)均匀地分布数据,所以他们使用简单的哈希/模函数来随机选择分区。

    【讨论】:

    • 非常感谢,partitioner拿到数据后,如何传递给reducers?
    • @user1585111 从技术上讲,分区程序不会“获取”数据。它有一个功能,getPartition,就像您在上面发布的那样。调用此函数以简单地告诉映射器需要将数据传递到哪个减速器实例。如果这个答案对你来说是正确的,你应该接受它是正确的:)
    • 好吧,就像我之前说的,排序是通过哈希码 + 模除法完成的。您可以在此处阅读有关分区的更多信息,Yahoo 对此进行了很好的解释:developer.yahoo.com/hadoop/tutorial/module5.html#partitioning
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-03
    • 2015-01-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多