自定义分区器,不设置还原数

rbpvctlc  于 2021-05-30  发布在  Hadoop
关注(0)|答案(1)|浏览(394)

使用自定义分区器必须设置减速器的数量吗?例如:字数计算问题,希望得到一个分区中所有停止字数的计数,剩余字数的计数要转到不同的分区。如果我将reducer的数量设置为2,并停止单词进入一个分区,其他单词进入下一个分区,它将起作用,但我将reducer的数量限制为2(或n),这是我不想要的。这里最好的方法是什么?或者我必须根据输入的大小来计算和设置减速器的数量,以获得最佳性能?

798qvoo8

798qvoo81#

指定自定义分区器不会更改任何内容,因为分区数已提供给分区器:

int getPartition(KEY key, VALUE value, int numPartitions)

如果不设置分区器,则 HashPartitioner 已使用。它的实现非常简单:

public int getPartition(K key, V value, int numReduceTasks) {
    return (key.hashCode() & Integer.MAX_VALUE) % numReduceTasks;
}

您可以自己设计一个定制的房间。分区器的主要目标是避免倾斜,并在提供的分区数上均匀地分配负载。对于一些小作业来说,决定只支持两个减速器是可以的,但是如果您希望您的作业可以扩展,那么您必须将作业设计为使用任意数量的减速器运行。
或者我必须根据输入的大小来计算和设置减速器的数量,以获得最佳性能?
这始终是您必须做的,与自定义分区器的使用无关。必须设置还原数,默认值为1,hadoop不会为您计算这个值。
如果要将停止字发送到一个减速机,将其他字发送到另一个减速机,可以执行以下操作:

public int getPartition(K key, V value, int numReduceTasks) {
    if (isStopWord(key) {
        return 0;
    } else {
        return ((key.hashCode() & Integer.MAX_VALUE) % (numReduceTasks - 1)) + 1;
    }
 }

但是,它很容易导致大的数据倾斜。第一个减速机将过载,需要比其他减速机更长的时间才能完成。在这种情况下,使用两个以上的减速器是没有意义的。
可能是xy问题。我不确定你问的是不是解决你实际问题的最好办法。

相关问题