使用自定义分区器必须设置减速器的数量吗?例如:字数计算问题,希望得到一个分区中所有停止字数的计数,剩余字数的计数要转到不同的分区。如果我将reducer的数量设置为2,并停止单词进入一个分区,其他单词进入下一个分区,它将起作用,但我将reducer的数量限制为2(或n),这是我不想要的。这里最好的方法是什么?或者我必须根据输入的大小来计算和设置减速器的数量,以获得最佳性能?
798qvoo81#
指定自定义分区器不会更改任何内容,因为分区数已提供给分区器:
int getPartition(KEY key, VALUE value, int numPartitions)
如果不设置分区器,则 HashPartitioner 已使用。它的实现非常简单:
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问题。我不确定你问的是不是解决你实际问题的最好办法。
1条答案
按热度按时间798qvoo81#
指定自定义分区器不会更改任何内容,因为分区数已提供给分区器:
如果不设置分区器,则
HashPartitioner
已使用。它的实现非常简单:您可以自己设计一个定制的房间。分区器的主要目标是避免倾斜,并在提供的分区数上均匀地分配负载。对于一些小作业来说,决定只支持两个减速器是可以的,但是如果您希望您的作业可以扩展,那么您必须将作业设计为使用任意数量的减速器运行。
或者我必须根据输入的大小来计算和设置减速器的数量,以获得最佳性能?
这始终是您必须做的,与自定义分区器的使用无关。必须设置还原数,默认值为1,hadoop不会为您计算这个值。
如果要将停止字发送到一个减速机,将其他字发送到另一个减速机,可以执行以下操作:
但是,它很容易导致大的数据倾斜。第一个减速机将过载,需要比其他减速机更长的时间才能完成。在这种情况下,使用两个以上的减速器是没有意义的。
可能是xy问题。我不确定你问的是不是解决你实际问题的最好办法。