所以主要考虑用良好的缩减阶段来分配好分区。但是,例如,我们无法控制它,或者不知道如何做到这一点(我们不知道我们的数据)。创建比节点更多的reducer是否有意义?
是减速的大量将增加每减速器数据分发更好的机会? 这个问题的常见做法是什么?
所以主要考虑用良好的缩减阶段来分配好分区。但是,例如,我们无法控制它,或者不知道如何做到这一点(我们不知道我们的数据)。创建比节点更多的reducer是否有意义?
是减速的大量将增加每减速器数据分发更好的机会? 这个问题的常见做法是什么?
数据通常在使用模块散列分区的减速器中均匀分布。这意味着(有效地)将密钥的散列除以还原器的数量,其余部分是将值发送到的还原器的索引。例如,如果密钥的散列值为47269893425623,并且您有10个还原器,则47269893425623%10 = 3,因此第4个还原器(请记住,0-索引)获取该记录。
如果您的记录有热点密钥,这意味着大部分值都具有完全相同的密钥,那么添加减速器可能无济于事(您只会增加开销 - 所有这些密钥仍将继续到同一个reducer)。
如果您没有这种情况,那么添加减速剂可能会有所帮助。请记住,映射器和缩减器之间存在网络复制阶段。分解缩减器越多,映射器和缩减器之间的复制就越多,这样部分工作就会变慢。
选择减速机的数量在某些方面更像是一种艺术,而不是科学。你只需要尝试不同的事情,看看你的特定工作最适合什么。
一般情况下,我看到一对夫妇的主要选项:
增加减速的数量只会帮助这么多。在数学意义上,假设您的所有密钥均匀分布,除了hotkey
。然后,给定hotkey
的reducer分配为100MB,其他所有分配为100MB(极端)。如果你有两个减速器,你将有大约150MB的减速器1和50MB的减速器2。有三个reducer,你将有133MB(100MB + 33MB)的reducer,另外两个33MB。使用100个缩减器,您将看到一个101MB,其余全部为1MB。正如你所看到的,增加减速器的数量并没有多大帮助,但确实有一点帮助。可能不足以真正传播它那么薄。
热点不会成为许多工作的问题。默认的分区行为对于给予相对均匀的分布是完全合理的。
如果你有,你正试图壁球或非常倾斜的数据集中的热点,您可以编写自定义分区,以写上减速器数据变为特殊规则。例如,如果您知道有三个密钥是热点,则可以编写一个分区程序,将密钥1发送到简化程序1,将键2发送到简化程序2,将键3发送到简化程序3,然后将其他所有其他简化程序发送到其他简化程序。
'分解缩减者越多,需要在映射器和缩减器之间进行更多的复制,以使部分工作变得更慢。' - 我不同意这一点。更多的数据没有被发送过来......这是相同数量的数据被分割得更多。如果有的话,它会让它变得更快,因为你将网络运动更多地并行化。 –
我认为更多的减速器更好,因为我们对更小的一组键进行排序...... – yura