Hadoop-2.4.1自定义分区器,用于平衡Reducer

时间:2014-11-18 05:33:08

标签: hadoop mapreduce shuffle reduce partition

正如我们所知,在hadoop的shuffle阶段,每个reducer都从所有mapper的输出中读取数据(intermedia数据)。

现在,我们也知道默认情况下Hash-Partitioning用于reducer。

我的问题是:我们如何实现算法,例如局部性感知?

1 个答案:

答案 0 :(得分:0)

简而言之,你不应该这样做。

首先,您无法控制在集群上执行映射器和缩减器的位置,因此即使单个映射器的完整输出将转到单个缩减器,它们很可能会在不同的主机上运行数据将通过网络传输

其次,要使reducer处理mapper的整个输出,首先必须使mapper处理信息的正确部分,这意味着您必须通过对数据进行分区来预处理数据,然后运行单个映射器和每个分区的单个reducer,但是这个预处理本身会占用很多资源,所以它几乎没有意义

最后,你为什么需要它? map-reduce的主要概念是使用键值对进行操作,而reducer通常应聚合映射器为相同键输出的值列表。这就是使用散列分区的原因:在 K 缩减器之间分配 N 键。使用不同类型的分区器很少是一种情况。如果您需要数据位置,则可能更喜欢使用MPP数据库而不是Hadoop,例如。

如果您确实需要自定义分区程序,请参阅以下示例:http://hadooptutorial.wikispaces.com/Custom+partitioner。没什么特别的,只需根据传递的键和值以及减速器的数量返回减速器数量。使用主机名的哈希码除以(%)减少器的数量将使单个映射器的整个输出转到单个reducer。您也可以使用进程PID%减少器数量。但在此之前,您必须检查是否确实需要此行为。