在mapreducer中不运行partitioner的多个reducer

qxsslcnc  于 2021-05-29  发布在  Hadoop
关注(0)|答案(2)|浏览(384)

我试图理解在mr job中运行多个reducer的概念,并了解到是partitioner决定了哪些(键、值)对流向哪个reducer。

我的问题是:

我们可以运行多个减速器而不运行分区器吗?这是一个有效的方案吗?

wswtfjt7

wswtfjt71#

如果不指定分区器,则默认 HashPartitioner 跑。它只是基于密钥进行散列:

public int getPartition(K2 key, V2 value,  int numReduceTasks) {
    return (key.hashCode() & Integer.MAX_VALUE) % numReduceTasks;
}
cwdobuhd

cwdobuhd2#

将partitioner视为决定哪个reducer(bucket)将处理Map器的特定键值(元素)输出的实体。
默认的partitioner使用key的散列函数在reducer中划分元素。一个类比是核心javaMap集合如何使用哈希函数来决定元素(键值)的bucket(reducer)。
在这个过程中,它保证同一个键被发送到一个reducer(该reducer处理该键的所有值)。所以,如果Map器发出 m 唯一键(每个键可以有任何计数)和 n 在reducer中,partitioner尝试分配键,以便每个reducer m/n 唯一键以及与该键关联的值列表。
注意,可以在程序中设置减速器的数量。这意味着您正在说分区程序限制可用于分发密钥的存储桶的数量。

相关问题