创建比我们拥有的节点更多的减速器是否有意义?

时间:2012-06-14 19:46:42

标签: hadoop mapreduce

因此主要认为具有良好的减少阶段是良好的分区分配。但是,例如我们无法控制它,或者不知道如何做到这一点(我们不知道我们的数据)。

大量的减速机是否会增加每个减速机数据分配的机会? 这个问题的常见做法是什么?

2 个答案:

答案 0 :(得分:1)

数据通常使用模数散列分区在reducers中均匀分布。这意味着(有效地)密钥的散列除以reducer的数量,余数是该值被发送到的reducer的索引。例如,如果您的密钥的哈希是47269893425623,并且您有10个减速器,47269893425623%10 = 3,那么第4个reducer(记住,0-indexed)将获得该记录。

如果您的记录有热点密钥,意味着大部分值具有完全相同的密钥,那么添加reducers可能无济于事(您只需添加开销 - 所有这些密钥仍将继续使用相同的减速机)。

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

答案 1 :(得分:0)

选择减速器的数量在某种程度上更像是一门艺术,而不是一门科学。你只需要尝试不同的东西,看看什么最适合你的特定工作。

总的来说,我看到了几个主要选择:

  • 1-2减速器 - 这对于输出量较少的作业来说很方便,只需要一些文件就可以使后期处理更加高效
  • 系统上95%的减少位置 - 这将充分利用您的群集进行中型和大型MapReduce作业。您希望使用95%,这样就不会阻止较小的作业完成。
  • 系统上190%的缩小插槽 - 这仅适用于非常大的作业,不需要经常使用。

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


对于许多工作来说,热点不会成为问题。默认的分区行为对于为您提供相对均匀的传播是完全合理的。

如果您确实有一个热点正在尝试压缩或者是一个非常倾斜的数据集,您可以编写一个自定义分区程序来编写数据所针对的减速器的特殊规则。例如,如果您知道有三个热点密钥,则可以编写一个分区程序,将key1发送到reducer 1,key2发送到reducer 2,key3发送到reducer 3,然后将其他所有内容发送给其他reducer。