2012-06-14 21 views
3

所以主要考虑用良好的缩减阶段来分配好分区。但是,例如,我们无法控制它,或者不知道如何做到这一点(我们不知道我们的数据)。创建比节点更多的reducer是否有意义?

是减速的大量将增加每减速器数据分发更好的机会? 这个问题的常见做法是什么?

回答

1

数据通常在使用模块散列分区的减速器中均匀分布。这意味着(有效地)将密钥的散列除以还原器的数量,其余部分是将值发送到的还原器的索引。例如,如果密钥的散列值为47269893425623,并且您有10个还原器,则47269893425623%10 = 3,因此第4个还原器(请记住,0-索引)获取该记录。

如果您的记录有热点密钥,这意味着大部分值都具有完全相同的密钥,那么添加减速器可能无济于事(您只会增加开销 - 所有这些密钥仍将继续到同一个reducer)。

如果您没有这种情况,那么添加减速剂可能会有所帮助。请记住,映射器和缩减器之间存在网络复制阶段。分解缩减器越多,映射器和缩减器之间的复制就越多,这样部分工作就会变慢。

+1

'分解缩减者越多,需要在映射器和缩减器之间进行更多的复制,以使部分工作变得更慢。' - 我不同意这一点。更多的数据没有被发送过来......这是相同数量的数据被分割得更多。如果有的话,它会让它变得更快,因为你将网络运动更多地并行化。 –

+1

我认为更多的减速器更好,因为我们对更小的一组键进行排序...... – yura

0

选择减速机的数量在某些方面更像是一种艺术,而不是科学。你只需要尝试不同的事情,看看你的特定工作最适合什么。

一般情况下,我看到一对夫妇的主要选项:

  • 1-2减速器 - 这是很好的用少量输出它的方便,只是有几个文件出山工作使后处理更高效
  • 95%的系统减少插槽 - 这将充分利用您的群集为中型和大型MapReduce作业。你想使用95%,这样你就不会阻止较小的工作完成。
  • 系统上减少插槽的190% - 这只适用于非常大的作业,不需要经常使用。

增加减速的数量只会帮助这么多。在数学意义上,假设您的所有密钥均匀分布,除了hotkey。然后,给定hotkey的reducer分配为100MB,其他所有分配为100MB(极端)。如果你有两个减速器,你将有大约150MB的减速器1和50MB的减速器2。有三个reducer,你将有133MB(100MB + 33MB)的reducer,另外两个33MB。使用100个缩减器,您将看到一个101MB,其余全部为1MB。正如你所看到的,增加减速器的数量并没有多大帮助,但确实有一点帮助。可能不足以真正传播它那么薄。


热点不会成为许多工作的问题。默认的分区行为对于给予相对均匀的分布是完全合理的。

如果你有,你正试图壁球或非常倾斜的数据集中的热点,您可以编写自定义分区,以写上减速器数据变为特殊规则。例如,如果您知道有三个密钥是热点,则可以编写一个分区程序,将密钥1发送到简化程序1,将键2发送到简化程序2,将键3发送到简化程序3,然后将其他所有其他简化程序发送到其他简化程序。

相关问题