Hadoop如何分配给reducers来处理不平衡负载 - CustomPartition

时间:2014-01-30 15:12:36

标签: hadoop mapreduce reduce hadoop-partitioning

我有一个map reducer作业,必须输出多个输出,我在这个例子中使用multipleOutputFormat:http://grepalex.com/2013/05/20/multipleoutputs-part1/

以下是挑战:

  • 如果我的分区器向每个reducer发送一个密钥(假设密钥指的是单独的输出文件),那么我的一些具有大量数据的reducer将永远占用。
  • 如果我的分区器随机发送每个reducer(theKey + randomNumber),那么很多reducer写入多个输出,我有IO问题。

作为解决方案:

  • 选项1:根据重量为减速器分配键。所以所有的减速器都有相同的负载。 (1个大密钥被发送到5个不同的减速器,而6个小密钥被发送到单个减速器)

  • 选项2:再次根据重量分配键,但确保减速器只能使用一个键。 (1个大密钥被发送到5个不同的,但6个小密钥也被发送到单独的减速器)

优点&缺点:

  • 在选项1中:我有平衡的缩减器,但有些缩减器写入不同的文件(小键)。
  • 在选项2中:我有不平衡的减速器,但限制了减速器上的最大负载,每个减速器都写入自己的文件。

这两个选项都在合理的时间内运行。我需要一些建议,我应该选择哪一个。

谢谢

2 个答案:

答案 0 :(得分:0)

选项1似乎是最佳选择。两个选项的执行时间将接近相同,但选项1最大限度地减少了运行每个reducer所需的开销工作。

答案 1 :(得分:0)

选择2更好 还有另一种选择:添加一列作为键,只需在输入数据时使用列,因此不需要更多随机键。