正如 Hadoop wiki 给出的计算理想的 reducer 数量是 0.95 或 1.75 * (nodes * mapred.tasktracker.tasks.maximum)
但是什么时候选择0.95,什么时候选择1.75?决定这个乘数时考虑的因素是什么?
假设您的集群中有 100 个可用的 reduce 插槽。
负载因子为 0.95 时,所有 95 个 reduce 任务将同时启动,因为有足够的 reduce 插槽可用于所有任务。这意味着没有任务将在队列中等待,直到其余任务之一完成。当减少任务“小”时,我会推荐这个选项,即完成相对较快,或者它们都需要相同的时间,或多或少。
另一方面,在负载因子为 1.75 的情况下,100 个 reduce 任务将同时启动,数量与可用的 reduce 槽一样多,其余 75 个将在队列中等待,直到有一个 reduce 槽可用。这提供了更好的负载平衡,因为如果某些任务比其他任务“更重”,即需要更多时间,那么它们将不会成为工作的瓶颈,因为其他减少插槽,而不是完成它们的任务并等待,现在正在执行队列中的任务。这也减轻了每个reduce任务的负载,因为map输出的数据被分散到更多的任务上。
如果我可以表达我的意见,我不确定这些因素是否总是理想的。通常,我使用大于 1.75 的因子(有时甚至 4 或 5),因为我正在处理大数据,并且我的数据不适合每台机器,除非我将此因子设置得更高并且负载平衡也更好。