我们必须设置减少器的数量才能使用自定义分区器吗? 示例:字数统计问题,希望在一个分区中获取所有停用词计数,剩余字数计入到不同分区。如果我将减少器的数量设置为2并且停止单词转到一个分区而其他分区转到下一个分区,它将起作用,但我将减速器的数量限制为两个(或N),这是我不想要的。这里最好的方法是什么?或者我必须根据输入的大小计算并设置减速器的数量才能获得最佳性能?
答案 0 :(得分:0)
指定自定义分区程序不会更改任何内容,因为分区数已提供给分区程序:
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;
}
自定义分区的设计取决于您。分区的主要目标是避免偏斜并将负载均匀分布在提供的分区数上。对于一些小工作,可以决定只支持两个减速器,但如果你希望你的工作能够扩展,那么你必须设计你的工作,使用任意数量的减速器。
或者我必须根据输入的大小来计算和设置减速器的数量才能获得最佳性能?
这始终是您必须做的事情,与自定义分区程序的使用无关。你必须设置reducer的数量,默认值是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 problem。我不确定你所问的是解决实际问题的最佳方法。