【问题标题】:Default number of reducers默认减速器数量
【发布时间】:2016-12-15 22:36:04
【问题描述】:

在 Hadoop 中,如果我们没有设置 reducer 的数量,那么会创建多少个 reducer?

映射器的数量取决于(总数据大小)/(输入拆分大小), 例如。如果数据大小为 1 TB,输入拆分大小为 100 MB。那么映射器的数量将是(1000*1000)/100 = 10000(一万)。

reducer 的数量取决于哪些因素?为一个作业创建了多少个 reducer?

【问题讨论】:

  • reducer 的数量默认为 1,除非您使用 job.setNumReduceTasks(n); 将其设置为对您的应用程序有意义的任何自定义数字。我建议跳过现有的“经验法则”。
  • @vefthym 还是真的吗?我忘了指定任何数字,并且有 56Gb 的数据,它被分成 7 个文件,每个文件 8Gb。如果 1 个 reducer 的数据过多,是否会自动回退?
  • @Thomas 你指的是输出文件的数量,还是输入分割的数量?默认值 1 用于输出文件(减少任务)。我相信它仍然是真的。如果您没有以编程方式设置它,您也可以将其设置为运行时参数。
  • @vefthym 换一种说法:我没有以编程方式/在参数中设置任何数字。而且我不明白为什么我有 7 个每个 8Gb 的文件。为什么不是 19Gb 的 3 个文件或 4Gb 的 14 个文件或...?
  • @Thomas 没有关于您运行的代码的信息,我不能多说。如果您愿意,请添加一个新问题并在此处发布链接。具有与输入大小相同的输出大小(通常)并非如此。请在问题中说明您要做什么。

标签: hadoop mapreduce hdfs


【解决方案1】:

减少了多少?(来自official documentation)

reduce 的正确数量似乎是 0.95 或 1.75 乘以 (节点数)*(每个节点的最大容器数)。

对于 0.95,所有 reduce 都可以立即启动,并在地图完成时开始传输地图输出。在 1.75 中,更快的节点将完成他们的第一轮 reduce 并启动第二波 reduce,从而更好地完成负载平衡。

增加reduce的数量会增加框架开销,但会增加负载平衡并降低故障成本。

上述缩放因子略小于整数,以便在框架中为推测任务和失败任务保留一些减少槽。

本文也介绍了 Mapper 计数。

有多少张地图?

map 的数量通常由输入的总大小驱动,即输入文件的总块数。

地图的正确并行度水平似乎是每个节点大约 10-100 个地图,尽管对于非常 cpu-light 的地图任务,它已设置为 300 个地图。任务设置需要一段时间,因此最好至少花费一分钟来执行地图。

因此,如果您期望 10TB 的输入数据并且块大小为 128MB,那么您最终会得到 82,000 个地图,除非Configuration.set(MRJobConfig.NUM_MAPS, int)(仅提供框架的提示)用于将其设置得更高。

如果要更改reducer 数量的默认值1,可以将以下属性(来自hadoop 2.x 版本)设置为命令行参数

ma​​preduce.job.reduces

您可以使用

以编程方式设置
job.setNumReduceTasks(integer_numer);

查看另一个相关的 SE 问题:What is Ideal number of reducers on Hadoop?

【讨论】:

    【解决方案2】:

    默认情况下,reducer 的数量设置为 1。

    你可以通过添加参数来改变它

    mapred.reduce.tasks 在命令行或驱动程序代码或您传递的 conf 文件中。

    例如:命令行参数:bin/hadoop jar ... -Dmapred.reduce.tasks=<num reduce tasks> 或者,在驱动程序代码中为:conf.setNumReduceTasks(int num);

    推荐阅读: https://wiki.apache.org/hadoop/HowManyMapsAndReduces

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-09-10
      • 1970-01-01
      • 2022-01-10
      • 1970-01-01
      • 2015-10-09
      • 2019-04-03
      • 1970-01-01
      相关资源
      最近更新 更多